首页 > 后端开发 > C++ > 在现代 C 中通过 `const std::string&` 传递 `std::string` 仍然有好处吗?

在现代 C 中通过 `const std::string&` 传递 `std::string` 仍然有好处吗?

Susan Sarandon
发布: 2024-12-22 05:38:14
原创
663 人浏览过

Is Passing `std::string` by `const std::string&` Still Beneficial in Modern C  ?

将 Const std::string & 作为参数传递还有好处吗?

在最近的一次演讲中,著名 C 专家 Herb Sutter 建议通过 const & 传递 std::vector 和 std::string 的参数不再引人注目。为了说明这一点,他提出了一个编写如下的函数:

std::string do_something ( std::string inval )
{
   std::string return_val;
   // ... do stuff ...
   return return_val;
}
登录后复制

Herb 推断,由于 return_val 在函数返回时将是一个右值,因此可以使用具有成本效益的移动语义来返回它。然而,问题仍然存在:为什么要通过引用传递输入参数 inval ? std::string 对象的较大尺寸(由于堆指针和字符数组等组件)是否会使值传递更有利?

Herb 的基本原理

Herb 的建议源于涉及多个嵌套函数的场景。考虑这样一种情况:函数 A 调用函数 B,函数 B 又调用函数 C,每个函数都传递一个字符串参数。如果 B 和 C 将字符串作为 const &,则代码可能如下所示:

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

void C(const std::string & str) {
  // Use `str` without storing it.
}
登录后复制

这种方法有效地传递指针,避免复制或移动。 C 采用 const & 因为它不存储字符串。

但是,假设 C 现在需要存储字符串。将 C 修改为以下内容将强制 B 执行对其参数的复制,从而消除任何好处:

void C(const std::string & str) {
  // ...
  m_str = str;
}
登录后复制

相反,如果 str 在所有函数中按值传递,则依赖 std::move处理数据移动,C 可以简单地接受临时字符串的所有权,从而消除对副本的需要。

成本注意事项

虽然与使用引用相比,按值传递会带来轻微的性能损失,但它与使用 SSO 复制小字符串的成本相当。这些方法之间的选择取决于内存分配的频率和特定的用例。

以上是在现代 C 中通过 `const std::string&` 传递 `std::string` 仍然有好处吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板