ホームページ > バックエンド開発 > C++ > スピードが欲しいですか? Pass By Value: Copy Elision は常にパフォーマンスの勝者ですか?

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

Linda Hamilton
リリース: 2024-10-26 11:59:03
オリジナル
1046 人が閲覧しました

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

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

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

int main() {
  X(foo());
  Y(foo());
}</code>
ログイン後にコピー

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

左辺値と右辺値の引数:

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

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

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

注意:

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

追加リソース:

  • [Scott Meyer の GN13 Talk](https://www.youtube.com /watch?v=uk3-zmJWt-E) (タイムフレーム 8:10 および 8:56)
  • [juanchopanza のブログ: 「速度が必要ですか? (常に) 値渡しをしないでください」]

以上がスピードが欲しいですか? Pass By Value: Copy Elision は常にパフォーマンスの勝者ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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