c++ 移动语义是否在每种情况下都节省资源?

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

我知道 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) 如果我们假设 data 只是一个简单的整数或 即使是 非常大的未初始化数组 2) 这个移动构造函数看起来和用 shallow 调用复制构造函数几乎一样 复制喜欢

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

唯一的区别当然是在 move 构造中清空数据和大小,所以上面两段代码在内存和性能方面是否有任何性能改进,因为清空数据指针和大小实际上并没有保存我们 space 或内存正确,或者我在这里错过了一些东西。

这个问题让我知道什么时候使用浅拷贝或移动语义,以及它们之间是否有任何区别(移动方式中的属性归零除外)。

Is there any benifet using move constructor if we assume that data is just a simple integer or even a very large uninitialized array

没有

This move constructor seems pretty much the same as just calling copy constructor with a shallow copying.

是。

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

大多数标准容器(例如 std::vectorstd::array 除外)在指针后面间接保存它们的数据,因此它们具有有用的移动语义。

So there is no Big difference between these 2 pieces of code if used in a vector, is this right ?

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