ホームページ >バックエンド開発 >C++ >C 11: 戻り値に RVO または明示的な `std::move` を使用しますか?

C 11: 戻り値に RVO または明示的な `std::move` を使用しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-24 08:57:14224ブラウズ

C  11: RVO or Explicit `std::move` for Return Values?

c 11 戻り値の最適化か移動?

移動セマンティクスを持つオブジェクトを扱うとき、プログラマは明示的に std を使用するかどうか迷うかもしれません。 :move を実行するか、コンパイラに依存して戻り値の最適化 (RVO) を実行します。次のような場合:

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 );
}

どのアプローチが望ましいですか?

答えは明らかです:常に最初の方法を使用します。コンパイラはすでに戻り値を最適化できますが、std::move を明示的に使用すると、実際にはこの最適化が妨げられます。

コピー省略により、ローカルで定義された変数への右辺値参照を返すときに移動コンストラクターを使用できるようになります。 。結果を明示的に移動することで、コンパイラがこの最適化を実行することを防ぎます。

したがって、最適なパフォーマンスを得るには、明示的な移動を行わずに最初のメソッドのみを使用してください。可能な限り最も効率的なコードを生成することが保証されているため、コンパイラーに最適化を処理させます。

以上がC 11: 戻り値に RVO または明示的な `std::move` を使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。