1

次のコードを検討してください。

void doSomethingWithString(string& mString)
{
     // mString gets modified in here
}

string getCopy1(const string& mString) 
{ 
    string result{mString}; doSomethingWithString(result); return result; 
}

string getCopy2(string mString) 
{ 
    doSomethingWithString(mString); return mString; 
}

と の間getCopy1getCopy2あるもの:

  • 渡された文字列が変更されないことを明確に示しています
  • ユーザーが新しい文字列を返すことを明確に示しています
  • より高速/コンパイラによる最適化の向上 (C++11 対応、移動セマンティクスを考慮)

?

4

4 に答える 4

4

どちらのバージョンも、渡された値を変更する意図がないことを明確に示しています。

getCopy2右辺値がパラメーターとして渡される場合は、より効率的です。その場合、パラメータはコピーではなく移動されるため、コピーを実行する必要はなく、内部コピーは実行されません。の場合getCopy1、常に少なくとも 1 つのコピーを強制的に作成します。左辺値がパラメーターとして渡されている場合は、参照を作成する代わりに移動を行う必要があります。どちらがより効率的かは、コンパイラと文字列の実装の多くの詳細に依存しますが、移動の速度は参照を作成する速度に匹敵するはずです。

戻り値に関する限り、違いは見られません。

于 2013-06-10T13:33:54.797 に答える
3

getCopy1 と getCopy2 の間にあるもの:

  • 渡された文字列が変更されないことを明確に示しています

両方: まず、参照が必要ですが、参照はconst; 2 つ目は、独自のコピーを作成するためです。

  • ユーザーが新しい文字列を返すことを明確に示しています

Both: どちらも文字列インスタンスを返します。

  • より高速/コンパイラによる最適化の向上 (C++11 対応、移動セマンティクスを考慮)

2 番目の方法を使用することをお勧めします。入力パラメーターのコピーを作成する場合は、パラメーター自体で行うことをお勧めします (呼び出し時にコンパイラーにコピーを作成させる方がよい)。右辺値参照の場合、余分なコピーが行われないため、これも優れています。

于 2013-06-10T13:36:26.837 に答える
2

getCopy2多くの場合、より適切に最適化できます。これについては、 「速度が必要ですか? 値による受け渡し」できちんと説明されています。

于 2013-06-10T13:42:53.307 に答える