「速度が必要ですか? 値による受け渡し」 - パフォーマンスへの影響の調査
スコット・マイヤーズの「速度が欲しいですか? 値による受け渡し」という声明は疑問を引き起こしますオブジェクトを値で渡すことと参照で渡すことのパフォーマンス上の利点について。このコンテキストでは、値による受け渡しにはコピー操作が含まれますが、参照による受け渡しでは不要なコピーが回避されます。
構造体 X と Y を使用した次の例を考えてみましょう。
<code class="cpp">struct X { std::string mem_name; X(std::string name) : mem_name(std::move(name)) {} }; struct Y { std::string mem_name; Y(const std::string &name) : mem_name(name) {} };</code>
X のコンストラクターでは、引数 name は、std::string で move コンストラクターを呼び出して mem_name を初期化する前に、一時オブジェクトにコピーされます。 Y のコンストラクターでは、引数名は const 参照ですが、それでも mem_name を初期化するためにコピーが作成されます。したがって、X は「コピーしてから移動」操作を実行し、Y は単一のコピーを実行します。
Meyers の議論によると、(X のように) 値による受け渡しのほうが、次の理由により高速になる可能性があるようです。戻り値の最適化 (RVO) などの最適化の可能性。ただし、詳しく調べると、結果は渡される引数のタイプ (左辺値または右辺値) に依存することがわかります。
一般に、移動はポインタを渡すよりも高速です。これは本質的に参照による受け渡しと同じです。したがって、右辺値の場合、X のパフォーマンスは Y よりも優れていますが、左辺値の場合、パフォーマンスは同様です。
これは普遍的なルールではなく、最適化はコンパイラやプラットフォームによって異なる場合があることに注意することが重要です。特定のケースで最適なアプローチを決定するには、プロファイリングをお勧めします。
以上が値または参照による受け渡し: 「速度が必要ですか? 値による受け渡し」が実際に正しいのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。