2015-03-31 145 views
2

考虑这种函数:我应该使用std :: move函数返回std :: vector吗?

std::vector<int> generateVector() { 
    return std::vector<int>(10, 0); 
} 

是否有调用generateVector()这样的任何好处:

std::vector<int> v = std::move(generateVector()); 

..或者是这种举动的优化现在可以自动通过完成编译器?

+0

问问你自己为什么叫_rvalue references_ !! – 2015-03-31 15:09:23

+0

好的,现在我已经问过自己了。正如Scott Meyers所说,你应该使用即使int x = std :: move(y)我也很困惑,所以这个问题。我没有看到这些案件之间的区别。这不是一个重复的,完全不同的“可能重复”问题。 – user2061057 2015-03-31 15:29:35

+0

@ user2061057'或者这种移动优化现在是由编译器自动完成的吗?'。重复的答案表明:*所有的返回值已经被移动或者被优化了,所以不需要显式地移动返回值。*这不是对你的问题的直接回答吗?这不是重复的吗? – Julian 2015-03-31 15:36:15

回答

8

既不:

  • 有没有好处。

  • 除编译C++外,编译器没有什么特别之处。它可能会尽力做到这一点。

幸运的是,表达generateVector()已经是一个右值,所以v将与移动构造函数构造,但实际上你的v声明和你的generateVector定义受复制省略,使建筑可能被视为等同于:

std::vector<int> v(10, 0); 

换句话说,语言规则明确允许拷贝构造函数不能在这种情况下被调用,即使他们有副作用。

+2

之前有过这个话题,我记得那时有人认为使用std :: move会使代码变得更糟,因为copy elision比性能更好。 – BitTickler 2015-03-31 15:02:54

+2

@ user2225104:我认为只提到了return语句。即'return std :: move(std :: vector (10,0));'会是一个严格的悲观。 – 2015-03-31 15:09:33

6

std::move的目的是使右值变为右值。在你的情况下,generateVector()已经是一个右值,所以它是多余的。

+1

我**不会**说它是*“冗余”*(这意味着它根本没有效果,这可能是错误的)。我宁愿说它可能会阻止某些优化,例如移动省略。所以它更好*如果你不写'std :: move'。 – Nawaz 2015-03-31 15:06:48

5

返回对象的函数调用的结果已经是右值,因此应用std::move没有任何好处。

事实上,它可能是一个悲观:没有std::move,变量是直接从临时初始化,所以临时(和移动)可以被消除。

相关问题