在向量返回上移动语义行为

时间:2012-11-04 20:43:47

标签: c++ c++11 move-semantics

我一直在玩c ++ 11移动语义

在代码中......

#include <vector>
#include <string>

std::vector<std::string> GetNewVector()
{
  std::vector<std::string> newVec; 
  newVec.push_back(std::string("hello")); //(1)
  newVec.push_back(std::string("whey")); //(2)

  return newVec;
}

int main(int argc, char* argv[])
{
  std::vector<std::string> vec = GetNewVector();
}

在第(1)点,当对象移动到向量中时,将调用“hello”对象的移动构造函数。

在第(2)点,首先再次调用“hello”的移动构造函数,(我假设这是向量重新分配的位置),然后调用“whey”移动构造函数。

这一切都符合预期,但我期望在GetNewVector()结束时返回向量时再次移动对象,但移动构造函数不会再次被调用。我的猜测是RVO正在发生,但是当我在调试模式下运行Visual Studio(2k10)时,我不确定是否会发生这种情况?

如果可以执行RVO,那么它将优先于使用移动构造函数吗?

1 个答案:

答案 0 :(得分:6)

如果指定它们在元素方面移动,那么移动容器的优势就会严重削弱。

相反,它们只是将其他内部的内容,即std::vector s中动态分配的数组的指针放在一起,这使得元素保持原样,使这成为一个复杂的常量操作。如果你进行了元素移动,那么你就会看到线性复杂性操作。

  

如果可以执行RVO,那么它将优先于使用移动构造函数吗?

标准在这方面有点受限制,但是,RVO(一般来说,复制 - 省略,也包括与其名称相反的动作),当然会优先于其他任何东西,因为它更快。 :)

请注意,自动移动仅在copy-elision 可以完成的上下文中完成,但不是出于任何原因。有关自动移动的更复杂细节,另请参阅this question