ホームページ >バックエンド開発 >C++ >`std::string` と `std::vector` は値または Const 参照で渡す必要がありますか?

`std::string` と `std::vector` は値または Const 参照で渡す必要がありますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-29 00:22:10731ブラウズ

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

値によるパラメーターの受け渡し: const std::string &

Herb Sutter は最近、std::vector とconst 参照による std::string オブジェクト。彼は、次のコードに示すように、多くの場合、それらを値で渡すことが好ましいと示唆しています。

std::string do_something(std::string inval) {
  std::string return_val;
  // ... do stuff ...
  return return_val;
}

戻り値は関数の戻り時点では右辺値であり、コストをかけて移動できます。事実上、Sutter のステートメントの理論的根拠は次のような場合にあります。

関数 A が関数 B を呼び出し、関数 B が関数 C を呼び出すとします。A は a を渡します。文字列パラメータを B に渡し、それを C に転送します。A は C を直接知りません。

B と C が const 参照によって文字列を取得する場合、コードは次のようになります。

void B(const std::string &str) {
  C(str);
}

void C(const std::string &str) {
  // Process `str` without storing it.
}

このアプローチでは、ポインタの受け渡しだけで十分であり、コストのかかるコピーや移動を回避できます。

ただし、C がstring:

void C(const std::string &str) {
  // Process `str`.
  m_str = str;
}

これにより、コピー コンストラクターと潜在的なメモリ割り当てがトリガーされます (短い文字列の最適化は無視されます)。 C 11 の移動セマンティクスは不必要なコピーを排除することを目的としていますが、A が一時文字列を渡しても、C は const 参照を取得することでこれを防ぎます。

逆に、str がすべての関数を通じて値によって渡された場合、転送には移動セマンティクスに依存します。所有権がある場合、C はコピー操作を行わずにデータを採用または破棄することができます。このアプローチにはパフォーマンスのオーバーヘッドがわずかに伴いますが、メモリ割り当てが不要になるため、特定の使用例によっては利点が得られる可能性があります。

以上が`std::string` と `std::vector` は値または Const 参照で渡す必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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