Memory management 使用循环链表作为;“免费名单”;动态存储分配和释放过程中的v/s平衡二叉搜索树

Memory management 使用循环链表作为;“免费名单”;动态存储分配和释放过程中的v/s平衡二叉搜索树,memory-management,tree,linked-list,binary-tree,Memory Management,Tree,Linked List,Binary Tree,链表中的缺点是,对于malloc()块,内存分配器必须搜索链表,然后如果找到该地址,则返回该地址。。那么为什么不使用二叉树来减少搜索时间呢 NVIDIA提出的问题之一 找到一篇相关的文章讨论它如果我理解正确,请查看以下链接: 堆分配可以通过将空闲内存表示为链表来完成,但是任何合理复杂的内存管理器都会使用更快的方法,比如我在发布的问题的答案中提到的AVL树。甚至还有一种称为TLSF(两级隔离配合)的O(1)解决方案,也在回答中提到。您是说搜索一个特定的元素以释放?如果是这样的话,这仍然是一个搜

链表中的缺点是,对于malloc()块,内存分配器必须搜索链表,然后如果找到该地址,则返回该地址。。那么为什么不使用二叉树来减少搜索时间呢

NVIDIA提出的问题之一


找到一篇相关的文章讨论它

如果我理解正确,请查看以下链接:


堆分配可以通过将空闲内存表示为链表来完成,但是任何合理复杂的内存管理器都会使用更快的方法,比如我在发布的问题的答案中提到的AVL树。甚至还有一种称为TLSF(两级隔离配合)的O(1)解决方案,也在回答中提到。

您是说搜索一个特定的元素以
释放
?如果是这样的话,这仍然是一个搜索问题,除非我遗漏了什么……不,正如有人指出的,free是一个固定时间操作,但malloc()不是,我想?哈哈,那是我,我删除了评论,因为我认为我误解了这个问题。经过验证,我相当确定每个
空闲
都是一个固定时间操作,因为它甚至不需要触摸指针的内容,它只是在内部标记该块可用。至于malloc,它应该是O(N),但是因为内存管理器分配块,分配更大的块并不是线性地慢。释放还导致搜索空闲列表,以找到插入被释放块的正确位置。如果被释放的块与任一侧的空闲块相邻,它将与之合并成一个更大的块,因此存储不会变得太分散。确定邻接很容易,因为自由列表是按地址递减的顺序维护的。发信人:-我们说的是C/C++内存分配还是Java内存分配?它们是非常不同的机制…我认为这是最大的区别之一。我的回答和评论是指C的
malloc
free
工具。