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

Kha*_*led 1 c++ move copy-constructor

我知道 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};
}
Run Code Online (Sandbox Code Playgroud)

假设所有数组索引都被初始化为一个特定的变量,这样移动语义只会将数组指针保存在内存中,并将源数组清空,就像上面的例子一样,这将阻止动态创建新数组,如果我们使用复制构造函数(特定的深复制构造函数)但是

1) 如果我们假设数据只是一个简单的整数,甚至是一个非常大的未初始化数组,那么使用移动构造函数是否有任何好处 2) 这个移动构造函数看起来与仅使用浅复制调用复制构造函数非常相似,例如

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

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

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

Ast*_*ngs 7

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

不。

这个移动构造函数看起来与使用浅复制调用复制构造函数非常相似。

这是。

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

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