我在C ++中实现了一个内存池,具有以下约束:
在实时程序的运行期间经常会发生分配和释放,因此需要尽快发生。
到目前为止,我已使用两个链接列表作为存根来实现此内存池,一个用于free,另一个用于已分配的元素。这是有效的,但当然非常慢,因为每次释放或分配元素时,元素都需要从一个列表中删除并添加到另一个列表中,这是线性的。我希望这更快。
我可以使用哪些数据结构尽可能高效地进行(de)分配?我正在考虑使用红黑树(或类似的平衡BST)来存储分配的元素,以及free元素的优先级队列。这将使分配和释放都为O(log n)。
关于如何改进此设计的任何建议?我可以使用其他数据结构?是否可以使用常量时间操作来创建内存池(具有上述约束)?
编辑:我应该澄清一下,这些数据结构仅用于存储和访问内存地址,内存块本身已经分配并且是连续的。
答案 0 :(得分:1)
由于我们正在处理具有固定大小的内存块的内存池,因此可以按如下方式实现恒定时间操作。 :
block_address = base_address + index * block_size
轻松地从该索引派生,反之亦然。)prev
和next
指针。这如何符合要求: