1. ホーム
  2. c++

[解決済み] c++11 戻り値の最適化か移動か?重複

2022-04-22 20:06:24

質問

を使うべきタイミングがわかりません。 std::move とか、コンパイラに最適化させたほうがいい場合とか...。

using SerialBuffer = vector< unsigned char >;

// let compiler optimize it
SerialBuffer read( size_t size ) const
{
    SerialBuffer buffer( size );
    read( begin( buffer ), end( buffer ) );
    // Return Value Optimization
    return buffer;
}

// explicit move
SerialBuffer read( size_t size ) const
{
    SerialBuffer buffer( size );
    read( begin( buffer ), end( buffer ) );
    return move( buffer );
}

どちらを使うべきですか?

どのように解決するのですか?

最初の方法のみを使用します。

Foo f()
{
  Foo result;
  mangle(result);
  return result;
}

これは すでに は、移動コンストラクタがあれば、それを使用することができます。実際、ローカル変数が rvalue の参照にバインドできるのは return 文は、まさにコピーエリジョンが許可されているときです。

2番目のバージョンでは、コピーエリジョンを積極的に禁止していますね。最初のバージョンの方が普遍的に優れています。