内存重新对齐后重新对齐指针

Realigning pointers after memory realign

我有一个固定大小的内存池,它被分成给定大小的段。当我删除一些数据时,它会将数据正在使用的段标记为空闲。下次我尝试分配内存但没有 space 时,我通过将所有数据向下移动来重新对齐内存(例如,清除前 2 个段,将所有数据向下移动 2 个块)。这一切都很好,但我的问题是我指向该数据的指针没有改变,我不确定我该如何去做。

我通过向内存中的 space 返回一个 void* 从我的池中分配内存,假设我的池的大小可以容纳 2*sizeof(Data)。

Data* poolTest = new(pool->GetMemory(sizeof(Data))) Data(5, 5, 5);

所以池没有引用指针 poolTest。

所以现在如果我这样做:

pool->Free(poolTest);
Data* poolTest2 = new(pool->GetMemory(sizeof(Data))) Data(4, 5, 5);
Data* poolTest3 = new(pool->GetMemory(sizeof(Data))) Data(3, 5, 5);

poolTest3 的创建触发内存重新对齐,现在 poolTest2 指向与 poolTest3 相同的地址,poolTest1 指向 poolTest2 应指向的地址。

我可能只是遗漏了一些东西,或者我的结构搞砸了,但我真的坚持这一点。

重新表述您的问题:

我想在内存中移动数据以为新分配腾出空间。如何确保现有指针仍指向正确的位置?

你不能,除非你跟踪所有的指针,比如说,通过使用数组,而不是像这样访问你的数据:

*direct_ptr

你现在必须这样做:

*ptr_map[indirect_ptr]

每次移动东西,都需要相应地修改ptr_map。

数组的行为应该像一个堆栈。您也许可以编写一个指针包装器 class,在构造函数中递增一些 global/static 索引,并在析构函数中递减它。

它可能会节省一点点 space 但对计算机来说效率很低,对程序员来说也很麻烦。

如果您想进行自己的内存管理,请确保查看:

https://en.wikipedia.org/wiki/Buddy_memory_allocation

https://en.wikipedia.org/wiki/Slab_allocation

以及对现有技术的良好概述:

http://pages.cs.wisc.edu/~remzi/OSTEP/vm-freespace.pdf