「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > スピードが欲しいですか? Pass By Value: Copy Elision は常にパフォーマンスの勝者ですか?

スピードが欲しいですか? Pass By Value: Copy Elision は常にパフォーマンスの勝者ですか?

2024 年 11 月 18 日に公開
ブラウズ:255

 Want Speed? Pass By Value: Is Copy Elision Always the Performance Winner?

スピードをお求めですか?値による受け渡し: パフォーマンスに関する考慮事項

「速度が必要ですか? 値による受け渡し」の原則は、値による引数の受け渡しがコピー省略によりパフォーマンスを向上させる場合があることを示唆しています。説明のために、クラス 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) {}
};

int main() {
  X(foo());
  Y(foo());
}

ここで、 foo() は X コンストラクターと Y コンストラクターの両方に渡される一時文字列を返します。 X が mem_name を初期化するとき、std::string の move コンストラクターを呼び出します。これにより、文字列のコピーが回避される可能性があります。ただし、Y が mem_name を初期化するときは、文字列参照をコピーする必要があります。

Lvalue と Rvalue 引数:

左辺値 (一時的ではない) が渡される場合、両方の XそしてYはコピーを実行します。さらに、X が移動を実行します。右辺値 (一時値) の場合、X は移動のみを実行できますが、Y はコピーを実行する必要があります。

パフォーマンスへの影響:

一般に、移動は渡すよりも高速です。ポインター (参照渡しと同等)。したがって、X は、左辺値については Y と同様のパフォーマンスを持ち、右辺値についてはより優れたパフォーマンスを示します。

注意:

「速度が必要ですか? 値による受け渡し」は説得力のあるアイデアですが、慎重に適用する必要があります。大規模なデータ構造のコピーに関連する特定のコンテキストと潜在的なオーバーヘッドを考慮することが重要です。実際のパフォーマンスへの影響を判断するには、プロファイリングをお勧めします。

追加リソース:

  • [Scott Meyer の GN13 トーク](https://www.youtube.com /watch?v=uk3-zmJWt-E) (タイムフレーム 8:10 と 8:56)
  • [juanchopanza のブログ: 「速度が必要ですか? (常に) 値渡しをしないでください」]
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3