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

mas*_*oud 5 c++ c++11

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

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

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

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

public:

   move constructor ?!
};
Run Code Online (Sandbox Code Playgroud)

And*_*owl 10

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

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

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

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

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

你的类可能与a完全不同unique_ptr,也许可能相当重,但可能仍然存在使其不可复制的语义约束.在这种情况下,可以利用移动语义来强制执行正确的不变量.