传递左值时使用std :: move

问题描述 投票:2回答:2

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

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

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

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

c++ move-semantics
2个回答
1
投票

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

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

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


0
投票

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

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

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

void add(string && s) {
    my_vector.push_back(s);
}
© www.soinside.com 2019 - 2024. All rights reserved.