右辺値参照と移動セマンティクスを理解する
C 11 では、右辺値参照と移動セマンティクスは、一時的な値を操作する際のパフォーマンスと効率を向上させるために導入されました。右辺値参照 (&&) は一時オブジェクトを参照しますが、移動セマンティクスにより、あるオブジェクトの内容をコピーせずに別のオブジェクトに移動できます。
例 1
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector();
この例では、return_vector 関数は一時的な std::vector オブジェクトを返し、これは右辺値参照 rval_ref によってキャッチされます。一時オブジェクトは rval_ref に移動されるため、コピーは効果的に防止されます。
例 2
std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
この場合、return_vector 関数は一時的な std を返します。 :vector オブジェクトを値で取得し、std::move 関数を使用して一時オブジェクトの内容を返されたオブジェクトに明示的に移動します。これにより、rval_ref が破棄された一時オブジェクトへの参照を保持するようになるため、実行時エラーが発生します。
例 3
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
この例は例 1 と似ていますが、 return_vector 関数は一時的な std::vector オブジェクトを値で返し、 std::move を使用して内容を移動します。ただし、この場合、 std::move は不要であり、戻り値の最適化を妨げてパフォーマンスを妨げる可能性があります。
ベスト プラクティス
最良のアプローチは Example を使用することです。 4 では、明示的に std::move を使用せずに、一時オブジェクトが返されたオブジェクトに暗黙的に移動されます。コンパイラは、不要なコピーを避けるために戻り値の最適化 (RVO) を実行します。
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
以上がC 11 の右辺値参照と移動セマンティクスは戻りステートメントにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。