繁体   English   中英

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

[英]Move semantics for big non-pointer base objects

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

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

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

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

public:

   move constructor ?!
};

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

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

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

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

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

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

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

在SO中随机浏览,我发现了移动语义提议 引用是我的答案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM