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

时间:2018-11-08 02:32:01

标签: c++ pointers memory-management memory-alignment memory-pool

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

我通过向内存中的空间返回一个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应该指向的地址。

我可能只是缺少了一些东西,或者我的结构被搞砸了,但是我真的被卡在了上面。

1 个答案:

答案 0 :(得分:2)

重述您的问题:

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

您不能,除非您跟踪所有指针(例如,使用数组),而不是像这样访问数据:

*direct_ptr

您现在必须执行此操作:

*ptr_map[indirect_ptr]

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

该数组的行为应类似于堆栈。您也许可以编写一个指针包装器类,该类在构造函数中增加一些全局/静态索引,在析构函数中减少它。

它可以节省一些空间,但对计算机而言效率低下,对程序员而言则是一团糟。

如果要进行自己的内存管理,请确保签出:

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