在预分配的内存中移动数据
Moving data within pre-allocated memory
我一直在尝试为预分配的内存实现一个碎片整理程序。假设我们有 void 指针,带有预分配的内存用于sizeof(int) * 3
:
void* ptr = operator new(sizeof(int) * 3);
并初始化内存的第一块和第三块
int *one = new (ptr) int(1);
int *three = new (ptr + sizeof(int) * 2) int(3);
这是我的问题:是否可以在不知道值类型的情况下将值从(ptr + sizeof(int) * 2)
(*3(移动到第二(ptr + sizeof(int))
位置?
int *second = new (ptr + sizeof(int)) int(*three);
不是一种选择。
No.您必须知道已被void*
擦除的类型的大小。如果无法恢复类型(int
(,或者更确切地说是该类型占用的字节数(sizeof(int)
(,则无法可靠地在底层内存上运行。
是的,您需要知道并保留存储类型的大小。更重要的是,存储类型必须是微不足道的,至少是微不足道的可复制的。否则,存储的对象可能会非常惊讶地发现自己在内存中移动。如果需要支持此类非平凡类型,则必须使用其实际复制或移动构造函数或赋值运算符。
相关文章:
- 为什么复制而不是移动数据元素?
- 设计将引用元素移动到开头的数据结构.C++
- 在 c++ 中将数据从未对齐结构数组移动到对齐结构数组
- 函数超过堆栈大小,请考虑将一些数据移动到堆 (C6262)
- 在预分配的内存中移动数据
- 如何将图像数据从搜索窗口中移动到本地存储器OpenCL
- 为什么将 operator() 的定义从 .h 移动到.cpp文件会导致数据竞争?
- 编译器生成的移动成员在静态数据成员上功能
- 如何有效地将底层数据从 std::string 移动到其他类型的变量?
- C 可以使用MOVE SEMATICS将数据从一个向量移动到另一个向量
- 覆盖复制/移动分配超载时,我是否需要删除当前的成员数据
- 使用无锁指针队列在线程之间移动数据是否安全
- 当我们将数据从 ax 移动到端口地址时会发生什么
- 排序链表-移动节点还是交换数据成员
- 从中移动数据的向量的容量
- c++在数组中插入(和移动)数据
- 获取鼠标滚轮移动数据
- 在MVP层之间移动数据的众所周知的方法是什么?
- OpenCV错误:在矢量之间移动数据时断言失败
- 是否有任何未定义的行为问题,当移动数据到一个函数,然后回到它来自哪里