C 11 の右辺値と return ステートメントを使用した移動セマンティクス
C 11 では、右辺値参照と移動セマンティクスは、メモリ管理を最適化することで大幅なパフォーマンス上の利点をもたらします。そしてオブジェクトの所有権。これは、関数から値によってオブジェクトを返す場合に特に関係します。
右辺値参照と移動セマンティクスを理解する
右辺値参照 (&&) は、一時的なオブジェクトにバインドされる型です。物体、または破壊されようとしている物体。一時オブジェクトが右辺値参照を使用して関数から返される場合、コンパイラはコピー セマンティクスの代わりに移動セマンティクスを使用して戻り値を最適化できます。
移動セマンティクスには、オブジェクトのリソースの所有権を一時オブジェクトから一時オブジェクトに転送することが含まれます。オブジェクトの新しいコピーを作成せずにターゲット変数を使用します。これにより、特に大きなオブジェクトのパフォーマンスが大幅に向上します。
分析例
提供した 3 つの例を調べてみましょう:
最初の例:
この例では、一時オブジェクト tmp が次のように返されます。 価値。 rval_ref は右辺値参照であるため、一時オブジェクトにバインドされ、その有効期間が関数呼び出しを超えて延長されます。この動作は、一時オブジェクトへの const 参照を返すのと似ています。
2 番目の例:
この例では、次を使用して一時オブジェクト tmp を値で返そうとします。移動セマンティクス。ただし、rval_ref が破壊された tmp オブジェクトへの参照を保持しているため、実行時エラーが発生します。
3 番目の例:
この例は、最初の例と同等です。例。 tmp での移動操作は不要であり、戻り値の最適化 (RVO) を禁止することでパフォーマンスを妨げる可能性があります。
ベスト プラクティス
値によってオブジェクトを返すための推奨プラクティスは、次のとおりです。移動セマンティクスを明示的に使用せずに、単純にオブジェクトを返します。この場合、コンパイラーは、RVO または移動セマンティクスのどちらか効率的な方を使用して戻り値を自動的に最適化します。
このコード スニペットは一時オブジェクトを直接返すため、コンパイラーは最適な最適化戦略を決定できます。 .
以上がC 11 の右辺値参照と移動セマンティクスは、値によって返されるオブジェクトをどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。