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

问题描述 投票:0回答:1

我知道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)如果我们假设data只是一个简单的整数,或者使用move构造函数有什么好处? 甚至非常大的未初始化数组2)此move构造函数似乎与仅使用shallow调用复制构造函数 复制像

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

当然唯一的区别是Nulling data和size在move结构中,因此在内存和性能方面,上述两个代码段之间都没有任何性能改进,因为Nulling数据指针和大小实际上并没有节省我们的空间或记忆的权利,或者我在这里想念的东西。

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

c++ move copy-constructor
1个回答
1
投票

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

编号

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

是。

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

© www.soinside.com 2019 - 2024. All rights reserved.