传递左值

时间:2018-01-02 09:11:46

标签: c++ move-semantics

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

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

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

因为我不想复制变量然后回到我的载体

2 个答案:

答案 0 :(得分:1)

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

但除非这是您申请中的热点,否则差异可能会小到不被人注意。

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

答案 1 :(得分:0)

根据您对add方法的意图以及计划如何使用它,您应该考虑使用通用引用:将s参数声明为右值引用,然后:

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

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

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