当前位置 : 主页 > 手机开发 > 无线 >

移动C 11的语义是否会超越写时复制的习惯用法?

来源:互联网 收集:自由互联 发布时间:2021-06-10
我可能会在这里感到困惑,但我所理解的是: COW将返回“假”副本,直到其中一个呼叫者想要进行一些修改. Move Semantic将在所有情况下返回“假”副本. 因此,如果我的目的是拥有一个只需
我可能会在这里感到困惑,但我所理解的是:

> COW将返回“假”副本,直到其中一个呼叫者想要进行一些修改.
> Move Semantic将在所有情况下返回“假”副本.

因此,如果我的目的是拥有一个只需要读取而不需要更新的对象,那么我应该只等待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)

如果没有移动语义,您需要复制bigData以将其插入到listOfData中,或者手动将swap()转换为listOfData中的新空向量.但是使用移动语义,st_ :: vector的rvalue-reference-constructor(又名移动构造函数),由push_back在新数据中复制时调用,有权删除bigData的旧内容 – 因此,它允许窃取bigData的例如,内部指针并将bigData重置为空向量.

移动语义通常比COW语义更快,因为它们不需要维护对共享的只读数据的引用计数.但是,它们更受限制 – 您无法使用移动语义为数据创建多个引用计数别名,您可以轻松方便地在容器之间混洗数据.

另请注意,最近版本的GCC和Microsoft Visual C都支持rvalue引用和移动语义(GCC使用–std = c 0x),因此没有理由不开始使用它们.

网友评论