「速度が必要ですか? 値渡し」とパフォーマンスの最適化
コピーを多用する操作を扱う場合、開発者はパフォーマンスの最適化に努めることがよくあります。この前提は、スコット・マイヤーズが考案した「速度が欲しい? 価値に基づいて渡す」という公理につながりました。ただし、この概念では次のような疑問が生じます: 値による受け渡しは、常に参照による受け渡しよりもパフォーマンス上の利点があるのでしょうか?
次のクラス 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 では、コンストラクターは引数のコピーを受け取り、移動コンストラクターを使用してそのメンバー変数 mem_name を初期化します。 Y では、コンストラクターは const 参照を取得し、引数から直接 mem_name を初期化します。
次に、これらのクラスを利用するシナリオを検討してみましょう。
<code class="cpp">std::string foo() { return "a" + std::string("b"); } int main() { X(foo()); Y(foo()); }</code>
関数 foo() は、 X の name と Y の mem_name を初期化するために使用される一時値。
X の場合、コンパイラは foo() の構築を最適化し、その戻り値を name に直接配置できます。その後、name を mem_name に移動します。このプロセスでは、コピーなしで単一の移動が行われます。
対照的に、Y はこの最適化を実行できません。 foo() の一時的な戻り値をその参照名にバインドし、その値を mem_name にコピーします。したがって、Y はコピーを実行します。
要約すると、右辺値 (一時オブジェクト) を渡す場合、X での値による受け渡しはプロセスを 1 回の移動に最適化できる可能性がありますが、Y での参照による受け渡しには、コピー。ただし、この最適化はコンパイラの機能に依存するため、実際のパフォーマンスへの影響を判断するにはプロファイリングを常に推奨することに注意することが重要です。
以上が「速度が必要ですか? 値による受け渡し」は常に当てはまります: 参照による受け渡しが値による受け渡しよりも優れているのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。