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 サイトの他の関連記事を参照してください。