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::vector
,std::array
除外)在指针后面间接保存它们的数据,因此它们具有有用的移动语义。
So there is no Big difference between these 2 pieces of code if used
in a vector, is this right ?
仅当某些对象更改了指针指向的值或数组元素时才会出现差异,因为它会影响所有其他对象,因此如果您无意修改指针指向的元素或数组中的一个元素,你的 free 2 使用任何一种方式,尽管最好使用 Move 语义来使你的代码更容易出错。
我知道 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::vector
,std::array
除外)在指针后面间接保存它们的数据,因此它们具有有用的移动语义。
So there is no Big difference between these 2 pieces of code if used in a vector, is this right ?
仅当某些对象更改了指针指向的值或数组元素时才会出现差异,因为它会影响所有其他对象,因此如果您无意修改指针指向的元素或数组中的一个元素,你的 free 2 使用任何一种方式,尽管最好使用 Move 语义来使你的代码更容易出错。