C++ 可遍历内存池的数据结构
我在C++中实现内存池,有以下约束:C++ 可遍历内存池的数据结构,c++,memory,memory-management,data-structures,C++,Memory,Memory Management,Data Structures,我在C++中实现内存池,有以下约束: 分配的元素应按其内存地址的线性时间顺序进行遍历,以促进缓存重用 需要能够释放元素(内存块)并将它们返回到内存池 分配和解除分配在实时程序运行期间会频繁发生,因此需要尽可能快地发生 到目前为止,我已经使用两个链表作为存根实现了这个内存池,一个用于空闲,另一个用于分配的元素。这是可行的,但速度当然非常慢,因为每次释放或分配元素时,都需要从一个列表中删除该元素并将其添加到另一个列表中,这是线性的。我希望这能更快 我可以使用什么数据结构来尽可能有效地(取消)分配
- 分配的元素应按其内存地址的线性时间顺序进行遍历,以促进缓存重用
- 需要能够释放元素(内存块)并将它们返回到内存池
编辑:我应该澄清,这些数据结构仅用于存储和访问内存地址,内存块本身已分配且连续。由于我们处理的是具有固定大小内存块的内存池,因此可以实现如下恒定时间操作:
- 通过内存块在池中的索引来标识每个内存块(内存块的地址可以通过
从该索引轻松导出,反之亦然)块地址=基地址+索引*块大小
- 具有元数据的数据结构(以跟踪已分配和空闲的块)。一个符合需求的是一个固定大小的数组,其中一个项对应于每个内存块(由相同的索引标识)。该数组中嵌入了两个(双重)链表(一个用于分配的块,一个用于空闲块)。由于这些链表不重叠,它们可以使用相同的
和prev
指针next
- 线性时间遍历:内存块可以通过其索引(在这种情况下,作为元数据一部分的空闲/分配标志可能很有用)或通过两个链表中的任何一个进行遍历,具体取决于需要。对数组和链表的迭代是在线性时间内完成的
- 恒定时间分配:分配内存块意味着从空闲列表中获取第一个项目,并将其移动到分配的列表中(例如在末尾)。删除链表的第一项,以及将一项附加到链表的末尾都是固定时间操作(假设保留指向链表开始和/或结束的指针-使链表循环会有所帮助)。然后返回块的索引/地址
- 恒定时间解除分配:解除分配内存块意味着通过其索引标识相应的元数据项,并将其从分配列表移动到空闲列表中(例如,在末尾)。从数组中通过索引获取项、从(双重)链接列表中删除给定项以及将项追加到链接列表的末尾都是固定时间操作