如果在我的代码中,我已经声明了一个变量(例如字符串)并想要传递给某个函数,所以我的向量会添加该值。我是否总是需要这样做(使用std :: move),考虑到我不再需要传递变量了?
Void add(string s){
my_vector.push_back(move(s));
}
我知道我可以简单地传递一个右值,但是考虑我是否需要先声明字符串(使其成为右值),然后将其添加到向量中。
因为我不想复制变量然后回到我的载体
答案 0 :(得分:1)
如果你想要移动字符串,你必须这样说。否则将被复制。
但除非这是您申请中的热点,否则差异可能会小到不被人注意。
特别是对于std::string
,主要实现使用Small String Optimization,其中短字符串(通常为10-20个字节)将存储在字符串对象中以节省堆分配。在这种情况下,移动和复制将对短字符串执行相同的操作。
答案 1 :(得分:0)
根据您对add
方法的意图以及计划如何使用它,您应该考虑使用通用引用:将s
参数声明为右值引用,然后:
s
将是左值参考; s
将是右值参考。因此,只要有可能,以下代码将受益于移动语义优化:
void add(string && s) {
my_vector.push_back(s);
}