传递左值时使用 std::move

Using std::move when passing lvalue

如果在我的代码中,我声明了一个变量(例如字符串)并想传递给某个函数,这样我的向量就会添加该值。考虑到我不再需要传递的变量,我是否总是需要这样做(使用 std::move)?

Void add(string s){
    my_vector.push_back(move(s));
}

我知道我可以简单地传递一个右值,但考虑是否需要先声明字符串(使其成为右值)然后将其添加到向量中。

因为我不想复制变量然后推回我的向量

如果你想移动字符串,你必须这样说。否则会被复制。

但除非这是您应用程序中的热点,否则差异可能小到不会被注意到。

特别是对于 std::string,主要实现使用 Small String Optimization,其中短字符串(通常为 10-20 字节)将存储在字符串对象中以节省堆分配。在那种情况下,移动和复制将对短字符串执行相同的操作。

根据您打算用 add 方法做什么以及您打算如何使用它,您应该考虑使用通用引用:您将 s 参数声明为右值引用,并且然后:

  • 如果调用参数是左值,s将是左值引用;
  • 如果调用参数是右值,s 将是右值引用。

因此,以下代码将尽可能受益于移动语义优化:

void add(string && s) {
    my_vector.push_back(s);
}