我一直在玩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,那么它将优先于使用移动构造函数吗?
答案 0 :(得分:6)
如果指定它们在元素方面移动,那么移动容器的优势就会严重削弱。
相反,它们只是将其他内部的内容,即std::vector
s中动态分配的数组的指针放在一起,这使得元素保持原样,使这成为一个复杂的常量操作。如果你进行了元素移动,那么你就会看到线性复杂性操作。
如果可以执行RVO,那么它将优先于使用移动构造函数吗?
标准在这方面有点受限制,但是,RVO(一般来说,复制 - 省略,也包括与其名称相反的动作),当然会优先于其他任何东西,因为它更快。 :)
请注意,自动移动仅在copy-elision 可以完成的上下文中完成,但不是出于任何原因。有关自动移动的更复杂细节,另请参阅this question。