戻り値の最適化または移動?
C では、関数から値を返すときに、主に 2 つのアプローチがあります。戻り値を使用する最適化 (RVO)、または std::move 関数を明示的に使用します。この質問では、ケーススタディとして特定の例を使用して、各メソッドをいつ使用するかを検討します。
例:
SerialBuffer オブジェクトにデータを読み取る次のコード スニペットを考えてみましょう。そしてそれを返します:
SerialBuffer read(size_t size) const { SerialBuffer buffer(size); read(begin(buffer), end(buffer)); // Use RVO (first method) return buffer; // Explicit move (second method) // return std::move(buffer); }
使用RVO:
提供された回答によると、ほとんどの場合、RVO (最初の方法) を使用することをお勧めします。 RVO を使用すると、コンパイラーは、可能であればコピー操作を移動操作に自動的に変換できます。この最適化により、特に大きなオブジェクトのパフォーマンスが大幅に向上します。上記の例では、コンパイラは SerialBuffer オブジェクトを return ステートメントに直接移動できることを認識し、コピーの必要性を排除します。
RVO を禁止:
2 番目の方法では、std::move を使用して、RVO を明示的に防ぎます。これは、RVO が望ましくない特定のシナリオで役立ちます。たとえば、SerialBuffer クラスに共有データが含まれている場合、またはそのデストラクターでクリーンアップ操作を実行している場合、std::move を使用すると、移動ではなく適切なコピーが確実に作成されます。
結論:
一般に、戻り値は RVO に依存することが望ましいです。コンパイラーは移動を実行するタイミングを効率的に決定できるため、明示的なコーディングを必要とせずにパフォーマンスが向上します。 RVO が適切ではない例外的なケースでは、std::move の使用を検討できます。ただし、RVO を無効にすることの影響を理解し、それに応じてオブジェクトの有効期間を処理することが重要です。
以上がC の戻り値として RVO または `std::move` : いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。