const std::string& の受け渡しの陳腐化 参考文献: Herb Sutter の視点
最近の講演で、Herb Sutter は、 const& で std::vector と std::string を渡します。彼は、従来のアプローチ:
std::string do_something(const std::string& inval)
は、
std::string do_something(std::string inval)
に比べてあまり望ましくないと示唆しました。inval のサイズが維持されることは認められていますが、Herb の議論は関数連鎖を含むシナリオに由来しています。 A が B を呼び出し、次に C を呼び出す例を考えてみましょう。
ケース 1: const 参照による渡し
void B(const std::string& str) { C(str); } void C(const std::string& str) { /* Use str but do not store it */ }
C がストレージを必要とする場合、コピー操作が必要になります:
void C(const std::string& str) { m_str = str; }
ただし、const& を使用すると、C がそのディレクトリに移動された基になるデータにアクセスできなくなります。
ケース 2: 値による受け渡し
void B(std::string str) { C(std::move(str)); } void C(std::string str) { m_str = std::move(str); }
このシナリオでは、文字列は関数呼び出しを通じて移動され、不要なコピーが回避されます。値への移動によるパフォーマンスのオーバーヘッドは、Short String Optimization (SSO) による小さな文字列へのメモリ割り当てを回避する利点によって相殺されます。
最終的に、const 参照で渡すか値で渡すかの選択は、特定の用途によって異なります。ケースと、メモリ割り当て効率と潜在的なパフォーマンス上の欠点に対する開発者の好み。
以上がやはり `std::string` を `const std::string&` 参照で渡す必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。