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