C++在所有情况下移动语义节省资源吗? 我知道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}; }

C++在所有情况下移动语义节省资源吗? 我知道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}; },c++,move,copy-constructor,C++,Move,Copy Constructor,假设所有数组索引都初始化为一个特定的变量,这样move语义只会将数组指针保存在内存中,并使源数组的指针为空,如上面的示例所示,如果我们使用复制构造函数Deep copy constructor作为特定的 1如果我们假设数据只是一个简单的整数或整数,那么使用移动构造函数有什么好处吗 即使是非常大的未初始化数组 2此移动构造函数似乎与使用浅层 模仿 当然,唯一的区别是清空数据和move构造中的大小,所以在内存和性能方面,上面两段代码之间是否有任何性能改进,因为清空数据指针和大小实际上并没有为我们节省

假设所有数组索引都初始化为一个特定的变量,这样move语义只会将数组指针保存在内存中,并使源数组的指针为空,如上面的示例所示,如果我们使用复制构造函数Deep copy constructor作为特定的

1如果我们假设数据只是一个简单的整数或整数,那么使用移动构造函数有什么好处吗 即使是非常大的未初始化数组 2此移动构造函数似乎与使用浅层 模仿

当然,唯一的区别是清空数据和move构造中的大小,所以在内存和性能方面,上面两段代码之间是否有任何性能改进,因为清空数据指针和大小实际上并没有为我们节省空间或内存,或者我遗漏了一些东西

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

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

没有

这个move构造函数看起来与使用浅层复制调用copy构造函数几乎相同

是的

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

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

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

没有

这个move构造函数看起来与使用浅层复制调用copy构造函数几乎相同

是的

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

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


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

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


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


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

因此,如果在向量中使用,这两段代码之间没有太大区别,对吗?@ahmedamr•如果在向量中使用,这两段代码之间有很大区别。差异是否重要只有评测才能确定。@Eljay T的向量T有move==copy不会有很大的差异或任何其他差异T有move==move的向量T,如在第一段代码中,与T有move==copy的向量T相比会有很大的差异,例如在第二段代码中。@Eljay我将问题解释为,当移动向量与复制向量等效时,在向量中使用复制向量与使用移动向量是否有区别。因此,如果在向量中使用,这两段代码之间没有大的区别,这是对的吗?@ahmedamr•如果在向量中使用,这两段代码之间存在巨大差异。差异是否重要只有评测才能确定。@Eljay T的向量T有move==copy不会有很大的差异或任何其他差异T有move==move的向量T,如在第一段代码中,与T有move==copy的向量T相比会有很大的差异,例如在第二段代码中。@Eljay我将问题解释为,使用复制ctor和使用移动ctor之间会有区别吗 向量内的向量,当移动向量与复制向量等效时。
Copy::Copy(const &source){        // A shallow copy
        data = source.data;       // Assume data is an array of size = size
        size = source.size;
}