ホームページ  >  記事  >  バックエンド開発  >  値による受け渡しは参照による受け渡しよりも常に遅いのでしょうか? 「スピードが欲しい? 価値観でパスする」という議論を紐解く

値による受け渡しは参照による受け渡しよりも常に遅いのでしょうか? 「スピードが欲しい? 価値観でパスする」という議論を紐解く

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 10:45:02945ブラウズ

 Is Passing by Value Always Slower Than Passing by Reference? Unpacking the

「速度が必要ですか? 値による受け渡し」: 詳細な説明

「速度が欲しいですか? 値による受け渡し」のコンセプトが議論を引き起こしましたプログラミングコミュニティで。この記事では、引数を値で渡すことと参照で渡すことのパフォーマンスへの影響を詳しく掘り下げ、値で渡すことで速度が向上する状況を明らかにします。

構造体 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 &amp;name)
        : mem_name(name) {}
};</code>

X のコンストラクターでは、引数「name」がコピーされ、「mem_name」に移動されます。 Y のコンストラクターでは、「name」は const 参照であるため、最初のコピーは必要ありません。 Y のアプローチは、コピー操作が 1 回だけで、より効率的であるように見えるかもしれません。

しかし、「速度が必要ですか? 値渡し」という概念は、シナリオによってはコピーを省略できることを強調しています。次のコードを考えてみましょう。

<code class="cpp">std::string foo() { return "a" + std::string("b"); }

int main() {
    X(foo());
    Y(foo());
}</code>

この場合、X は foo() の戻り値を「name」オブジェクトの空間に直接構築できるため、追加のコピーが必要ありません。ただし、Y は一時的な戻り値を「mem_name」にコピーする必要があります。したがって、右辺値引数の場合、値による受け渡し (この場合は X による) は 1 回の移動操作になる可能性がありますが、参照による受け渡し (Y による) では不可避のコピーが必要になります。

要約:

  • 左辺値引数の場合、X と Y の両方が 1 つのコピー操作を実行します。
  • 右辺値引数の場合、X は単一の移動操作を実行できる可能性がありますが、Y は常にコピーを実行する必要があります。

参照による受け渡しは通常、ポインターを渡すことに変換されますが、移動操作はポインターを渡すよりも操作的に高速になる可能性があります。したがって、値渡しによって (場合によっては) 不必要なコピーを回避し、パフォーマンスを向上させることができます。

これらのガイドラインは絶対的なものではなく、慎重に解釈する必要があることに注意することが重要です。疑わしい場合は、特定のシナリオに対する実際のパフォーマンスへの影響を判断するためにプロファイリングをお勧めします。

以上が値による受け渡しは参照による受け渡しよりも常に遅いのでしょうか? 「スピードが欲しい? 価値観でパスする」という議論を紐解くの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。