6

私は (N)RVO について読んでいて、1 つの完全なシナリオの説明が欲しいです。この質問が他の C++ 学習者のアイデアを明確にするのに役立つことを願っています。

次のシナリオを想定します。

string get_string() {
    string x("racecar");
    //work on x...
    return x;
}

string a( get_string() );
string b = get_string();

C++11 の move-semantics はしばらく無視してください。

  • (N)RVO が実行されない場合、いくつのコンストラクター/代入/デストラクタが実行されますか? (それらが参照するオブジェクトを指摘してください)
  • (N)RVOを適用すると何が変わる?
  • std::string最後に、移動セマンティクスをサポートするC++11 で状況がどのように変化するかを説明します。
4

1 に答える 1

6

1) の内部get_stringでは、1 つの文字列オブジェクト (x) が、const char*.

2) 関数が戻ると、内部で構築された文字列は、呼び出し元の空間にある一時的な文字列オブジェクトにコピー構築されます。

3) テンポラリは にコピー構築されaます。

4) 1を参照

5) 2を参照

6)3を参照してください。ただし、コピーは次の場所に移動しますb

RVO を使用すると、目に見えない参照を介して関数内に一時的なものを構築することで、2 と 5 をなくすことができます。さらにコピー省略 (RVO ではない) を使用すると、3 と 6 を削除できます。したがって、const char*コンストラクターを使用する 2 つの構造が残ります。

C++11 の移動セマンティクスでは、コンパイラがすべてのコピー省略を実行するのに十分なほど優れていれば、状況はまったく変わりません。コピーの省略が行われない場合、2、3、5、および 6 は引き続き存在しますが、コピーではなく移動になります。ただし、コピー省略とは異なり、これらの移動はオプションの最適化ではありません。準拠するコンパイラは、まだコピー省略を実行していないと仮定して、それらを実行する必要があります。

于 2012-10-20T10:14:10.400 に答える