如何优化C内存分配器的free()操作?

如何优化C内存分配器的free()操作?,c,memory,linked-list,malloc,free,C,Memory,Linked List,Malloc,Free,我有一个用循环链表实现的C内存分配器。自由列表中的块按地址排序。每次将块返回到自由列表时,列表都会迭代,以找到插入相邻块并与之合并的正确位置 问题是:有没有一种方法可以提高free()操作的性能,这样它就不需要每次遍历整个列表来找到插入块的位置 我在今天的一次采访中被问到这个问题,当时我不知道。我们可以使用散列或其他方法吗?有很多方法可以尝试优化对有序列表中项目的访问 散列不太可能有帮助,因为您没有尝试在列表中查找项目,而是找到适当的位置在列表中插入新项目或将其与现有项目合并,因此您永远不会扫

我有一个用循环链表实现的C内存分配器。自由列表中的块按地址排序。每次将块返回到自由列表时,列表都会迭代,以找到插入相邻块并与之合并的正确位置

问题是:有没有一种方法可以提高free()操作的性能,这样它就不需要每次遍历整个列表来找到插入块的位置


我在今天的一次采访中被问到这个问题,当时我不知道。我们可以使用散列或其他方法吗?

有很多方法可以尝试优化对有序列表中项目的访问

  • 散列不太可能有帮助,因为您没有尝试在列表中查找项目,而是找到适当的位置在列表中插入新项目或将其与现有项目合并,因此您永远不会扫描现有项目
  • 如果经常按地址升序释放块(在许多情况下可能会发生这种情况),则将最后释放的项保留为列表指针既简单又有效
  • 其他更复杂的方法(如树)可能有助于更快地定位插入点,但在以后重用空闲块时必须正确维护。此维护的成本可能会抵消
    free()
    函数的优势,尤其是在多线程环境中

与传统的基于竞技场的双链接列表或带有简单本地免费列表的大小箱子相比,这种分配策略似乎没有任何真正的优势。

问题在于缺少有关malloc策略的信息。是否使用了列表中的第一个配件块?malloc程序是否也可以扩充以帮助免费使用?红黑树可能有用,但必须通过修改malloc来保持一致。RB树很有用,因为它们是经过分类和平衡的。听起来像是“了解面试官的想法”之类的问题。在大多数情况下,链表的性能都很糟糕,处理链表的一种方法是使用静态数组来实现它们,这也允许随机访问。但这样你就不会使用free()。这可能取决于你的空间效率。对于大小为2的幂的块,存在非常有效的分配器。“每个最小块消耗额外的~1比特。@Lundin:问题是关于使用链表实现的内存分配器,而不是使用内存分配器实现的链表。该分配器将在多线程环境中使用吗?”?