为什么将运行时堆用于C风格语言中的动态内存分配,并将数据结构都称为“堆”?有关系吗?
为什么将运行时堆用于C风格语言中的动态内存分配,并将数据结构都称为“堆”?有关系吗?
Answers:
唐纳德·克努斯(Donald Knuth)说(计算机编程艺术,第三版,第1卷,第435页):
几位作者于1975年左右开始将可用内存池称为“堆”。
他没有说出哪位作者,也没有提及任何特定的论文,但是他说与优先级队列相关的术语“堆”的使用是传统的含义。
它们具有相同的名称,但实际上并不相似(即使从概念上来说也是如此)。内存堆被称为堆,与将洗衣篮称为“衣服堆”的方式相同。此名称用于表示一个混乱的地方,可以随意分配和释放内存。数据结构(正如您所引用的Wikipedia链接所指出的)非常不同。
碰撞这个名字很不幸,但并不是那么神秘。堆是一个很小的通用词,用来表示堆,集合,组等。在数据结构中使用该词早于(我很确定)内存池的名称。实际上,在我看来,对于后者而言,游泳池本来是更好的选择。堆表示垂直结构(如堆),适合数据结构,但不适合内存池。我们不认为内存池堆是分层的,而数据结构背后的基本思想是将最大的元素保持在堆(和子堆)的顶部。
堆的数据结构可以追溯到60年代中期。堆内存池,七十年代初。Wijngaarden至少早在1971年就使用了堆(意思是内存池)一词。在讨论Algol。
可能最早将堆用作数据结构是在七年前的
Williams,JWJ 1964中发现的。“算法232-堆排序”,ACM通讯 7(6):347-348
实际上,阅读有关内存分配方式的信息(请参阅Buddy Blocks)使我想起了数据结构中的堆。
查找可用内存分配的算法使用类似堆的数据结构。以下摘录自http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html。
当
new
被调用时,它开始寻找适合您的要求尺寸的空闲内存块。假设找到了这样的内存块,则将其标记为保留,并返回指向该位置的指针。有几种算法可以实现此目的,因为必须在扫描整个内存以找到大于对象大小的最小空闲块,或者返回适合内存的第一个空闲块之间做出折衷。为了提高获取内存块的速度,在类似于二进制树(称为堆)的数据结构中保留了内存的可用区和保留区。
问:什么是堆?A.堆是放置在彼此之上的对象的集合。
回答您的问题:内存堆和二进制堆都使用您所知道的相同概念。数据以堆的形式存储在内存中,其存储顺序与程序中编写的顺序相同。而二进制堆是一种数据结构,其遵循的概念与以堆的形式以有序方式存储数据的概念相同。其他)。让我知道您在评论部分的想法。
也许实现的第一个内存堆是由堆结构管理的?