2

戻り値の最適化について学びました ( C++ でのオブジェクトの戻り値、http://en.wikipedia.org/wiki/Return_value_optimizationhttp://blog.knatten.org/2011/08/26/dont-be-afraid-of- return-by-value-know-the-return-value-optimization/ ) 一時オブジェクトの生成を防ぎます。

また、一時オブジェクトを防ぐためにも使用できる右辺値参照 ( http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html ) についても学びました。世代。

実際には、オブジェクトのコピーによるパフォーマンスの低下を気にせずに値を返すことはできますか?

つまり、これら 2 つのコード スニペットは同等ですか?

A hello()
{
    A a(20);
    cout << &a << endl;
    return a;
}

// rvalue reference to prevent temporary object creation
A&& a = hello();
cout << &a << endl;

// expects compiler remove the temporary object
A a = hello();
cout << &a << endl;
4

1 に答える 1

1

呼び出し元に新しいオブジェクトを論理的に渡したい場合は、何よりもまず値で返す必要があります。RVO が発生しない場合は、Move が発生します。移動できない場合は、コピーが発生します。Move はたいてい些細なことですが、それは明らかにオブジェクトに依存します。コピーにコストがかかる移動不可能な型を返す場合、RVO に依存できるかどうかの判断がより難しくなります。幸いなことに、それはまれなケースです。

RVO は非常に広く適用できるため、RVO を実現しないようにすることはかなり困難です。一部のコンパイラでは、戻り値の三項ステートメントがそれを壊すことを私は知っています。少なくとも VS では、NRVO はデバッグで発生しません。そのため、デバッグ ビルドのパフォーマンスが影響を受けることに注意してください。

上記の特定のコードに対してコンパイラが生成したアセンブリを見て、両方のケースで同じかどうかを確認してください。それはおそらくそうです。

于 2013-06-18T02:09:00.433 に答える