値によるパラメーターの受け渡し: 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 サイトの他の関連記事を参照してください。