在预分配的内存中移动数据

Moving data within pre-allocated memory

本文关键字:移动 数据 内存 预分配      更新时间:2023-10-16

我一直在尝试为预分配的内存实现一个碎片整理程序。假设我们有 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)(,则无法可靠地在底层内存上运行。

是的,您需要知道并保留存储类型的大小。更重要的是,存储类型必须是微不足道的,至少是微不足道的可复制的。否则,存储的对象可能会非常惊讶地发现自己在内存中移动。如果需要支持此类非平凡类型,则必须使用其实际复制或移动构造函数或赋值运算符。