「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 値または参照による受け渡し: 「速度が必要ですか? 値による受け渡し」が実際に正しいのはいつですか?

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

2024 年 11 月 8 日に公開
ブラウズ:903

  Passing by Value or Reference: When is \

「速度が必要ですか? 値によるパス」 - パフォーマンスへの影響の探求

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

構造体 X と Y を使用した次の例を考えてみましょう。

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) {}
};

X のコンストラクターでは、std::string で move コンストラクターを呼び出して mem_name を初期化する前に、引数名が一時オブジェクトにコピーされます。 Y のコンストラクターでは、引数名は const 参照ですが、それでも mem_name を初期化するためにコピーが作成されます。したがって、X は「コピーしてから移動」操作を実行しますが、Y は 1 つのコピーを実行します。

マイヤーズの議論によると、(X のように) 値による受け渡しのほうが、次の理由により高速になる可能性があるようです。戻り値の最適化 (RVO) などの最適化の可能性。ただし、詳しく調べると、結果は渡される引数のタイプ (左辺値または右辺値) に依存することがわかります。

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

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

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3