按值传递参数:重新思考 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中文网其他相关文章!