0

我一直在玩 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”的移动构造函数(我假设这是向量重新分配的位置),然后调用“乳清”移动构造函数。

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

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

4

1 回答 1

6

如果指定它们以元素方式移动,则容器上移动的优势将被严重削弱。

取而代之的是,它们只是采用其他内部胆量,即在 s 情况下指向动态分配数组的指针std::vector,从而将元素留在它们所在的位置,从而使其成为恒定的复杂性操作。如果您进行了元素移动,您将看到线性复杂性操作。

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

该标准在这方面受到了一些限制,但是是的,RVO(通常是复制省略,也涵盖与其名称相反的移动)当然会优先于其他任何东西,因为它更快。:)

请注意,自动移动仅在可以进行复制省略的情况下进行,但不是出于任何原因。有关自动移动的更复杂细节,另请参阅此问题

于 2012-11-04T20:46:36.837 回答