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(如果我们假设数据只是一个简单的整数或 甚至是一个非常大的未初始化数组2(这个移动构造函数似乎与仅使用浅层调用复制构造函数几乎相同复制喜欢
Copy::Copy(const &source){ // A shallow copy
data = source.data; // Assume data is an array of size = size
size = source.size;
}
当然,唯一的区别是 清零数据 ,以及移动结构中的大小,因此上述两段代码在内存和性能方面是否有任何性能改进,因为清空数据指针和大小实际上并没有为我们节省空间或内存,或者我在这里错过了一些东西。
这个问题使我能够知道何时使用浅层复制或移动语义,以及它们之间是否有任何区别(除了在移动方式中清零属性(。
如果我们假设数据只是一个简单的整数,甚至是一个非常大的未初始化数组,是否有任何使用 move 构造函数的好处
不。
这个移动构造函数似乎与仅使用浅层复制调用复制构造函数几乎相同。
是的。
"移动"仅用于转移资源的所有权,并且只有在间接持有资源(例如通过指针(的情况下才能执行此操作。然后,您可以交换指针。但是,如果您必须交换实际数据,那么这基本上只是一个副本。
大多数标准容器(如std::vector
,以及std::array
除外(间接地将其数据保存在指针后面,因此这些容器具有有用的移动语义。
所以如果使用,这两段代码之间没有太大区别 在向量中,这是对的吗?
仅当某个对象更改了指针或数组元素所指向的值时,才会出现差异,因为它会影响所有其他对象,因此,如果您无意修改指针或数组元素所指向的元素,则 free 2 使用任何一种方式,尽管最好使用 Move 语义使您的代码更容易出错。
- 具有瞬态资源的RAII类
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 如何跨平台将二进制资源构建到程序中?
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- C++链接时间资源"allocation"而不定义
- 使用 Bazel 生成 QT 资源文件
- 编译器资源管理器和 GCC 具有不同的输出
- 使用 Bazel 编译 QT 应用程序时访问资源
- 根据需要声明资源,而不重复它们
- meson-build:wxWidgets 资源文件,用于 Windows 未构建
- C++ 移动语义是否在任何情况下都能节省资源?
- 为什么c++仍然不使用vector的共享资源来节省内存