首页 > 后端开发 > C++ > 我们还应该通过 const & 传递 std::string 吗?

我们还应该通过 const & 传递 std::string 吗?

DDD
发布: 2024-12-12 14:27:14
原创
940 人浏览过

Should We Still Pass std::string by const &?

Const Std::string 和参数的过去时代

在最近的一次讨论中,Herb Sutter 提出了这样的观点:通过 const & 参数传递 std::vector 和 std::string 可能不再具有相同的权重。他提出的替代方案,即按值传递这些对象,引发了争论并提出了问题。

理解过渡

萨特为什么提倡这种转变?主要原因在于类似于下面描述的场景:

考虑一个函数 A 调用函数 B,函数 B 又调用函数 C。函数 A 将一个字符串通过 B 传递到 C 中,并保持它不知道C 的存在。

Const & Approach:

当 B 和 C 接收字符串为const & 参数,交互发生如下:

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

void C(const std::string &str) {
  // Manipulates `str` but does not store it.
}
登录后复制

这种方法有效地循环指针,避免不必要的复制或移动。 C 接受 const & 因为它只打算使用字符串,而不是存储它。

值方法:

但是,如果 C 的功能要求它存储字符串,进行如下修改:

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

如您所见,C 不再简单地使用字符串,还存储它。 C 11 的移动语义理论上应该消除不必要的复制,但 C 的 const & 参数阻止了这一点。相反,复制构造函数和潜在的内存分配开始发挥作用。

绕过 Const &:

绕过 const & 参数并通过所有函数按值传递字符串可以消除这种情况问题。 std::move 可以在需要时有效地打乱数据。如果函数打算保留字符串,它可以这样做。

性能注意事项:

与使用引用相比,按值传递确实会产生更高的性能开销。然而,对于受益于 SSO 的小字符串,成本可以忽略不计。

结论

是否通过 const & 或 value 传递 std::string 的决定取决于具体用例及其对内存分配的敏感性。虽然按值传递可能不是普遍优选的,但它在某些情况下提供了引人注目的优势。

以上是我们还应该通过 const & 传递 std::string 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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