移动大型非指针基础对象的语义

时间:2013-05-24 13:53:59

标签: c++ c++11

当我阅读关于移动语义和右值引用的示例时,它们正在利用rvalue引用的优点,并围绕包含指针 的大对象移动语义。 1 2

例如,他们只是复制移动对象内的指针并将其设置为nullptr。 (移动/交换)

我的问题是,对于没有指针但是它们很大的对象,移动语义是否有任何优势(性能)?

class BigClass
{
   int data[BIG_SIZE];
   int a01;
   .
   .
   . many members
   .
   .
   int z99;

public:

   move constructor ?!
};

3 个答案:

答案 0 :(得分:10)

  

对于没有指针但是它们很大的对象,移动语义是否有任何优势?

它在性能方面没有任何优势,因为你不会像你所注意到的那样迅速“偷走”被移动物体的内脏。

但是,从纯粹的逻辑角度来看,类的语义可能使得您的对象不应该是可复制的,因此不能/不应该提供复制构造函数。 / p>

例如,unique_ptr的内部不是任何可以被移动的任何东西都比它可以被复制的更快(它是原始指针上的零开销包装器),但是语义约束使得无法复制一个unique_ptr。在这种情况下,移动语义就是保持不变量,只有一个 unique_ptr指向某个对象必须在程序中的某个时间存在。

因此,unique_ptr的移动构造函数(或移动赋值运算符)也必须重置移动的指针以保持不变量。

您的课程可能与unique_ptr完全不同,可能相当重,但可能仍存在语义限制,使其无法复制。在这种情况下,可以利用移动语义来强制执行正确的不变量。

答案 1 :(得分:1)

由于每个对象都保留了其所有数据的副本,并且没有指向传输的指针,因此如上所述,无法进行浅层复制。根据具体情况,将其他对象设置回其默认状态可能是有意义的,但这是移动构造函数和复制构造函数之间唯一可能存在的差异。

答案 2 :(得分:0)

在SO中随机浏览,我发现了移动语义proposal。引用是我的回答:

  

对于POD,移动和复制是相同的操作(直到   机器指令级别。)