我应该依赖复制省略还是移动语义?

Bru*_*der 2 c++ c++17

给出一个矢量

std::vector<BigObject> v;
Run Code Online (Sandbox Code Playgroud)

和工厂功能

BigObject genBigObject();
Run Code Online (Sandbox Code Playgroud)

我想避免复制BigObject实例.

哪一个更快?

v.push_back(genBigObject());
Run Code Online (Sandbox Code Playgroud)

要么

v.push_back(std::move(genBigObject()));
Run Code Online (Sandbox Code Playgroud)

我可以依靠复制省略将事实八方通发生的呢?(我可以删除复制构造函数BigObject,但是,好吧......)

Bar*_*rry 10

其目的std::move()是采用左值并将其视为右值,以便明确其他功能,如果他们愿意,可以蚕食物体的内部结构.

genBigObject()已经是右值了.你不需要把move()它变成一个 - move()只是没有为你提供任何有价值的东西.所以就是不要这样做.你甚至不需要深入了解下游究竟发生了什么 - 这move()是代码和读者的信号,你正在做一些可能不安全的事情,但在这种情况下......你不是.

对于这种特定情况,您push_back()无论如何都要调用rvalue引用重载- 这会触发临时对象的临时实现.是否由于特定的调用push_back()或稍早的调用而发生的临时实现move()没有任何区别.

  • @BrunoGrieder如果你的意思是`BigObject b = genBigObject(); v.push_back(std :: move(b));`那么是 - `b`是一个左值(注意,它是`b`,特别是名称,这是左值)所以`move(b)`确实有一个影响 (2认同)