値または参照による受け渡し: 「速度が必要ですか? 値による受け渡し」が実際に正しいのはいつですか?

Susan Sarandon
リリース: 2024-10-27 01:34:03
オリジナル
528 人が閲覧しました

  Passing by Value or Reference: When is

「速度が必要ですか? 値による受け渡し」 - パフォーマンスへの影響の調査

スコット・マイヤーズの「速度が欲しいですか? 値による受け渡し」という声明は疑問を引き起こしますオブジェクトを値で渡すことと参照で渡すことのパフォーマンス上の利点について。このコンテキストでは、値による受け渡しにはコピー操作が含まれますが、参照による受け渡しでは不要なコピーが回避されます。

構造体 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 は両方ともコピーを実行します ( name を初期化するときは X、mem_name を初期化するときは Y)、その後に X で移動操作が続きます。
  • Rvalues: X は RVO が適用できる場合にのみ移動を実行できますが、Y は引き続き移動を必要とします

一般に、移動はポインタを渡すよりも高速です。これは本質的に参照による受け渡しと同じです。したがって、右辺値の場合、X のパフォーマンスは Y よりも優れていますが、左辺値の場合、パフォーマンスは同様です。

これは普遍的なルールではなく、最適化はコンパイラやプラットフォームによって異なる場合があることに注意することが重要です。特定のケースで最適なアプローチを決定するには、プロファイリングをお勧めします。

以上が値または参照による受け渡し: 「速度が必要ですか? 値による受け渡し」が実際に正しいのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート