我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?
我试图理解rvalue引用并移动C++ 11的语义.
这些示例之间有什么区别,哪些不会执行矢量复制?
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> &&rval_ref = return_vector();
Run Code Online (Sandbox Code Playgroud)
std::vector<int>&& return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return std::move(tmp);
}
std::vector<int> &&rval_ref = return_vector();
Run Code Online (Sandbox Code Playgroud)
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return std::move(tmp);
}
std::vector<int> &&rval_ref = return_vector();
Run Code Online (Sandbox Code Playgroud) 如果我正确地得到它,移动语义允许从临时的,未命名的对象移动和重用资源.RVO虽然先前的移动语义更进一步,但"窃取"整个对象以避免额外的构造函数调用和赋值/复制函数.
这对我来说似乎有点反直觉,如果被调用的构造函数直接使用最终左值目标的地址直接将数据放在用户需要的地方,那么它会不会更快,更简单,用户更明显?
我的意思是,"在这个位置创建这个对象"似乎比"在某处创建这个对象,然后将其复制到正确的位置"更直观.
c++ optimization move-semantics return-value-optimization emplace