首页 >后端开发 >C++ >您应该通过值还是常量引用传递'std::string”和'std::vector”?

您应该通过值还是常量引用传递'std::string”和'std::vector”?

Susan Sarandon
Susan Sarandon原创
2024-12-29 00:22:10731浏览

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

按值传递参数:重新思考 const std::string &

Herb Sutter 最近质疑传递 std::vector 和 的传统做法std::string 对象通过 const 引用。他建议,在许多情况下,现在更可取的是按值传递它们,如以下代码所示:

std::string do_something(std::string inval) {
  std::string return_val;
  // ... do stuff ...
  return return_val;
}

虽然返回值是函数返回点的右值,并且可以移动成本 -实际上,Sutter 语句的基本原理在于这样的情况:

考虑一个调用函数 B 的函数 A,函数 B 又调用函数 C。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 的移动语义旨在消除不必要的复制,但 C 采用 const 引用可以防止这种情况发生,尽管 A 传递了临时字符串。

相反,如果 str 通过所有函数按值传递,则依赖移动语义来传输所有权,C 可以采用或丢弃数据,而不会引起复制操作。这种方法会带来轻微的性能开销,但它消除了内存分配,这可能是有利的,具体取决于特定的用例。

以上是您应该通过值还是常量引用传递'std::string”和'std::vector”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn