c++ - 内存重新对齐后重新对齐指针

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

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

我通过将 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。

数组应该表现得像一个堆栈。您也许可以编写一个指针包装类,在构造函数中增加一些全局/静态索引并在析构函数中减少它。

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

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

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

关于c++ - 内存重新对齐后重新对齐指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53200729/

相关文章:

c - 结构程序停止,没有任何错误

c - 函数 fgets 不存储字符串

algorithm - 一部 10GB 的电影如何在有限的主内存中运行?

c++ - 在用 delete 释放的对象的析构函数中使用 free

c++ - 在 C/C++ 中将 int 转换为 bool

c++ - Visual Studio 2008调试;在写入值时中断

c++ - 如何在 C++ 中初始化整数指针?

multithreading - 如何最小化分配和初始化 NSDateFormatter 的成本?

c++ - 如何使用 SIFT 特征/描述符作为 SVM 训练的输入?

c++ - 在理解 C++ 基本类的一小部分方面需要帮助吗?