将 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中文网其他相关文章!