【发布时间】:2015-06-29 07:26:55
【问题描述】:
在最坏的情况下,在大小为n 的内存部分(这是正确的术语吗?)上,链表需要O(n) 时间来分配合适大小的内存块。
但是,如果malloc 是基于树的,例如区间树,则只需要O(logn) 时间。此外,一棵树无需额外的时间(就时间复杂度而言)就可以满足这些要求,例如"Find the smallest block of free memory whose size is larger themx"、"Always allocate on the borders of free memory" 和"Free only a part of the allocated memory"。一个缺点可能是释放内存需要O(logn) 时间。
谢谢
ps。看到Data structures for traversable memory pool的问题了,但是作者好像没搞明白。
【问题讨论】:
-
是什么让您认为
malloc使用了链表?仅仅因为 一个 (许多)实现使用了它? -
@JoachimPileborg 我读到
ptmalloc2在链表中使用块,它在最新版本的 glibc 中。 -
您是否真的尝试过编写自己的
malloc和free函数,使用其他东西,并测量与当前实现相比分配所需的时间。 -
@MatsPetersson 我写了一个模型,在数组上玩,假装一些“程序”需要内存。
-
结果如何?整体执行时间是否有很大改善?在琐碎的程序中,我看到
malloc占用了很大一部分时间。但在非平凡的程序中,通常不是花费时间的地方——显然高度依赖于程序的确切功能!但是内存分配至少在过去 40 年里就已经存在了,而且模型在很大程度上是相同的——我相信有些人已经研究过它。
标签: c++ c memory memory-management data-structures