【发布时间】:2013-05-20 03:43:55
【问题描述】:
当我阅读有关移动语义和右值引用的示例时,它们利用了右值引用的优势,并围绕包装指针 的大对象移动语义。 12
例如,他们只是复制移动对象内部的指针并将其设置为nullptr。 (移动/交换)
我的问题是,对于没有指针但它们很大的对象,移动语义是否有任何优势(性能)?
class BigClass
{
int data[BIG_SIZE];
int a01;
.
.
. many members
.
.
int z99;
public:
move constructor ?!
};
【问题讨论】:
-
是的。在移动操作之后,other 对象被(或应该)重置为 default 状态。
-
不,就直接价值成员而言,这并没有真正的优势。
-
@CaptainObvlious 为什么要浪费时间将另一个对象更改为默认状态?该标准没有指定其他对象在移动操作后应该处于哪种状态。看到另一个对象(表面上)是一个临时对象,我能看到更改它的唯一原因是如果我们想利用它的析构函数来清理来自
*this的资源(这通常通过交换另一个对象和 @987654326 来完成@)。 -
@Agentlien 不完全正确。标准确实规定对象必须处于可破坏状态。
-
@AndreKostur 当然,这是真的。在考虑了更多之后,我想说在移动构造函数中进行最小重置是好的,其中有必要确保析构函数做正确的事情并且不会释放其所有权应该被移动到目标实例的资源。在移动分配中,您需要交换此类成员。但是对于不拥有(智能)指针或类似资源处理程序的成员,重置似乎仍然是多余的。