我知道C ++移动语义应该节省处理器能力和内存,因为
Move::Move(Shallow&& source) noexcept // Move constructor
{
data = source.data; // Assume data is an array of size = size and all initiated to a user specific value
size = source.size;
source.size =0;
source.data ={nullptr};
}
假设所有数组索引都初始化为一个特定的变量,那么move语义将只将数组指针保存在内存中,并使源数组为空,就像上面的示例一样,这将防止动态创建新数组。使用复制构造函数(具体来说,是深度复制构造函数),但是
1)如果我们假设数据只是一个简单的整数甚至是一个非常大的未初始化数组,那么使用move构造函数有什么好处?2)这种move构造函数似乎与只调用带有浅拷贝的copy构造函数几乎一样
Copy::Copy(const &source){ // A shallow copy
data = source.data; // Assume data is an array of size = size
size = source.size;
}
当然唯一的区别是Nulling data和move结构中的大小,因此在内存和性能方面,上述两个代码段之间都没有任何性能改进,因为Nulling数据指针和大小实际上并没有节省我们的空间或内存是的,否则我想念这里的东西。
这个问题使我可以知道何时使用浅表复制或Move语义,以及它们之间是否有任何区别(以移动方式使属性无效)除外。
如果我们假设数据只是一个简单的整数,甚至是一个非常大的未初始化的数组,那么使用move构造函数会有什么好处?
没有。
这个move构造函数看起来几乎像只是通过浅拷贝调用copy构造函数一样。
它是。
“移动”仅用于转移资源的所有权,并且只有在资源是间接持有(例如通过指针)的情况下,您才可以这样做。然后,您可以交换指针。但是,如果您必须交换实际数据,则基本上只是一个副本。
大多数标准容器(例如std::vector
和除外std::array
)都在指针后面间接保存其数据,因此它们具有有用的移动语义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句