6

移動セマンティクスは、コンパイラーがRVOおよびNRVOを使用できない場合に役立ちます。しかし、その場合、コンパイラはこれらの機能を使用できませんか?

4

2 に答える 2

5

答えは、コンパイラと状況に依存するということです。たとえば、制御フローの分岐はオプティマイザを混乱させる可能性があります。ウィキペディアはこの例を示しています:

#include <string>
std::string f(bool cond = false) {
  std::string first("first");
  std::string second("second");
  // the function may return one of two named objects
  // depending on its argument. RVO might not be applied
  return cond ? first : second;
}

int main() {
  std::string result = f();
}
于 2012-05-09T21:15:14.480 に答える
3

さて、コンパイラがRVOを使用できるかどうかはそれほど重要ではありませんが、それによってコピーの作成を回避できるかどうかは関係ありません。

検討:

struct Blah
{
    int x;
    Blah( int const _x ): x( _x ) { cout << "Hum de dum " << x << endl; }
};

Blah foo()
{
    Blah const a( 1 );
    if( fermatWasRight() ) { return Blah( 2 ); }
    return a;
}

ここで副作用(コンストラクターからの出力)を取得することは、一見a、呼び出し元が提供するストレージに直接構築することとはかなり互換性がありません。しかし、コンパイラが十分に賢い場合は、このオブジェクトの破棄はnull操作であることに注意できます。そして、より一般的には、特定の状況で、コンパイラーが十分に賢い場合は、コードをいかにこっそり設計しても、コピー操作を回避できる可能性があります。

正式なものはわかりませんが、上記のオブジェクトのペイロードが多いため、コピーのコストが高くなるのは、移動セマンティクスが役立つ1つのケースであり、コンパイラの賢さに関係なく最適化が保証されます。 (か否か)。

于 2012-05-09T21:13:07.693 に答える