我可能会在这里感到困惑,但我所理解的是:
因此,如果我的目的是拥有一个只需要读取而不需要更新的对象,那么我应该只等待我的C++编译器中的移动语义支持?
我对吗 ?
谢谢 :)
移动语义不会返回"假"副本.相反,在复制操作中,它赋予copyee删除原始副本的权限.
一个激励性的例子可能是有益的:
std::vector<int> bigData;
// fill bigData
std::vector<std::vector<int> > listOfData;
listOfData.push_back(std::move(bigData));
// after this point, the contents of bigData are unspecified (however accessing it is _not_ undefined behavior)
Run Code Online (Sandbox Code Playgroud)
如果没有移动语义,则需要复制bigData以将其插入到listOfData中,或者手动将其转换为listOfData中swap()的新空向量.但是使用移动语义,rvalue-reference-constructor(又名移动构造函数)std::vector,push_back在新数据中复制时调用,有权删除旧内容bigData- 因此,允许窃取bigData内部指针并重置bigData为例如,一个空矢量.
移动语义通常比COW语义更快,因为它们不需要维护对共享的只读数据的引用计数.但是,它们更受限制 - 您无法使用移动语义为数据创建多个引用计数别名,您可以轻松方便地在容器之间混洗数据.
另请注意,最近版本的GCC和Microsoft Visual C++都支持rvalue引用和移动语义(GCC with --std=c++0x),因此没有理由不立即开始使用它们.