C++ 移动语义是否在任何情况下都能节省资源?

Does c++ move semantics save resources in every situation?

本文关键字:节省 资源 在任何情况下 移动 语义 是否 C++      更新时间:2023-10-16

我知道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};
}

假设所有数组索引都初始化为特定变量,因此移动语义将只将数组指针保存在内存中并将源数组清空,如上例所示,这将阻止动态创建新数组,如果我们使用复制构造函数(深拷贝构造函数是特定的(

但是1(如果我们假设数据只是一个简单的整数或 甚至是一个非常大的未初始化数组2(这个移动构造函数似乎与仅使用浅层调用复制构造函数几乎相同复制喜欢

Copy::Copy(const &source){        // A shallow copy
data = source.data;       // Assume data is an array of size = size
size = source.size;
}

当然,唯一的区别是 清零数据 ,以及移动结构中的大小,因此上述两段代码在内存和性能方面是否有任何性能改进,因为清空数据指针和大小实际上并没有为我们节省空间或内存,或者我在这里错过了一些东西。

这个问题使我能够知道何时使用浅层复制或移动语义,以及它们之间是否有任何区别(除了在移动方式中清零属性(。

如果我们假设数据只是一个简单的整数,甚至是一个非常大的未初始化数组,是否有任何使用 move 构造函数的好处

不。

这个移动构造函数似乎与仅使用浅层复制调用复制构造函数几乎相同。

是的。

"移动"仅用于转移资源的所有权,并且只有在间接持有资源(例如通过指针(的情况下才能执行此操作。然后,您可以交换指针。但是,如果您必须交换实际数据,那么这基本上只是一个副本。

大多数标准容器(如std::vector,以及std::array除外(间接地将其数据保存在指针后面,因此这些容器具有有用的移动语义。

所以如果使用,这两段代码之间没有太大区别 在向量中,这是对的吗?

仅当某个对象更改了指针或数组元素所指向的值时,才会出现差异,因为它会影响所有其他对象,因此,如果您无意修改指针或数组元素所指向的元素,则 free 2 使用任何一种方式,尽管最好使用 Move 语义使您的代码更容易出错。