为什么两个不同的概念都被称为“堆”?

时间:2009-11-09 04:12:58

标签: c++ heap terminology heap-memory

为什么运行时堆用于C风格语言的动态内存分配,而the data structure都称为“堆”?有一些关系吗?

9 个答案:

答案 0 :(得分:65)

唐纳德克努特说(计算机编程艺术,第三版,第1卷,第435页):

  

有些作者在1975年开始将可用内存池称为“堆”。

他没有说明哪些作者并没有提及任何具体论文,但确实说与优先级队列相关的术语“堆”的使用是传统意义上的。

答案 1 :(得分:50)

它们具有相同的名称但它们实际上并不相似(甚至在概念上)。内存堆称为堆,就像您将洗衣篮称为“衣服堆”一样。此名称用于指示一个有点混乱的地方,可以随意分配和释放内存。数据结构(正如您引用的维基百科链接所指出的那样)是完全不同的。

答案 2 :(得分:28)

名字碰撞是不幸的,但不是那么神秘。 是一个小的,常用的词,用于表示堆,集合,组等。使用单词作为数据结构的前置(我很确定)池的名称记忆事实上,在我看来, pool 对后者来说是一个更好的选择。 意味着一个垂直结构(如一堆),它适合数据结构,但不适合内存池。我们不认为内存池堆是层次结构的,而数据结构背后的基本思想是将最大元素保留在堆顶部(和子堆)。

数据结构可以追溯到60年代中期;堆内存池,早在70年代。术语堆(意思是内存池)至少在1971年被Wijngaarden用于讨论Algol时使用。

可能最早使用作为数据结构七年前发现了 Williams,J。W. J. 1964.“算法232 - Heapsort”, ACM通讯 7(6):347-348

答案 3 :(得分:6)

实际上,阅读有关内存分配方式的内容(参见Buddy Blocks)让我想起了数据结构中的堆。

答案 4 :(得分:5)

IMO这两个完全不相关的东西具有相同的名称只是偶然/巧合。它就像graphgraph

答案 5 :(得分:4)

类似堆的数据结构由查找可用内存分配的算法使用。以下内容摘自http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

  

当调用new时,它会开始寻找符合请求大小的空闲内存块。假设找到了这样的内存块,它被标记为保留,并返回指向该位置的指针。有几种算法可以实现这一点,因为必须在扫描整个内存以找到大于对象大小的最小空闲块之间进行折衷,或者返回第一个需要内存所需的块。为了提高获取内存块的速度,内存的空闲和保留区域保持在类似于称为堆的二叉树的数据结构中。

答案 6 :(得分:0)

C ++标准中没有使用口语术语堆栈内存和堆内存。该标准使用静态存储,线程存储,自动存储和动态存储。

可以在标准的Storage Duraction section找到更多内容。

因此,从语言和标准库的角度来看,没有混淆。

答案 7 :(得分:0)

问:什么是堆? A.堆是彼此重叠放置的对象的集合。

回答您的问题: 众所周知,内存堆和二进制堆都使用相同的概念。 数据以堆的形式存储在内存中,其存储顺序与程序中写入的顺序相同。而二进制堆是一种数据结构,其遵循的概念与以堆的形式以有序方式存储数据的概念相同。其他)。 让我知道您在评论部分的想法。

答案 8 :(得分:-1)

也许实现的第一个内存堆是由堆结构管理的?