传递左值时使用 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);
}
如果在我的代码中,我声明了一个变量(例如字符串)并想传递给某个函数,这样我的向量就会添加该值。考虑到我不再需要传递的变量,我是否总是需要这样做(使用 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);
}