23

我试图找到免费商店通常被称为堆的官方(或足够好的)原因。

除了它从数据段的末尾增长,我真的想不出一个好的理由,特别是因为它与堆数据结构关系不大。

注意:相当多的人提到这只是一堆杂乱无章的东西。但是对我来说,堆物理这个词意味着一堆物理上相互依赖的东西。你从下面拉出一个,其他所有东西都倒在上面,等等。换句话说,对我来说,堆听起来组织松散(例如,最新的东西在上面)。这并不是堆在大多数计算机上的实际工作方式,但如果你把东西放在堆的开头然后增长它,我想它可以工作。

4

9 回答 9

36

Knuth 拒绝将术语“堆”用作空闲内存存储的同义词。

几位作者在 1975 年左右开始将可用内存池称为“堆”。但是在本系列书籍中,我们将仅在与优先级队列相关的更传统意义上使用该词。(基本算法,第 3 版,第 435 页)

于 2009-03-19T02:47:32.930 回答
20

值得一提的是,早于 C 的 ALGOL68 有一个实际的关键字 heap,用于从“全局堆”中为变量分配空间,而不是loc在堆栈上分配空间。

但我怀疑使用可能仅仅是因为它没有真正的结构。我的意思是,你不能保证在内存中获得最合适的块或下一个块,而是你会根据分配策略的突发奇想来获得你所得到的东西。

像大多数名字一样,它可能是一些只需要名字的程序员想到的。

我经常听说它有时被称为竞技场(很多个月前的一条错误消息说“内存竞技场已损坏”)。这会显示内存块在地址空间内以角斗式进行战斗的图像(就像电影 Tron 一样)。

最重要的是,它只是一个内存区域的名称,您也可以将其称为 brk-pool 或 sbrk-pool(在调用修改它之后)或其他十几个名称中的任何一个。

我记得当我们在 OSI 7 层模型还没有出现之前就将通信协议栈放在一起时,我们使用了分层方法,并且必须在每一层为块提出名称。

我们使用了块、段、块、节和各种其他名称,所有这些都只是表示一个固定长度的东西。可能堆有类似的起源:

卡罗尔:“嘿,鲍勃,对于一个只从大区域分配随机内存位的数据结构来说,有什么好名字?”

鲍勃:“‘热气腾腾的马粪’怎么样?”

Carol:“谢谢,Bob,如果你同意的话,我会选择‘heap’。顺便问一下,离婚的进展如何?”

于 2009-03-19T02:39:04.917 回答
17

它被命名为一个堆,因为它会让人联想到一个堆栈的对比图像。

  • 在一堆物品中,物品按照它们放置在那里的顺序放置在另一个之上,并且您只能移除最上面的一个(不会将整个东西翻倒)。

    像一堆文件一样堆叠

  • 在堆中,物品的放置方式没有特定的顺序。您可以按任何顺序进入和移除项目,因为没有明确的“顶部”项目。

    像一堆甘草一样堆

它很好地描述了在堆栈和堆中分配和释放内存的两种方式。嗯!

于 2009-03-19T13:55:38.003 回答
3

它是无序的。存储“堆”。

它不是一个有序的堆数据结构

于 2009-03-19T02:27:05.943 回答
3

我不知道它是否是第一个,但 ALGOL 68 有关键字 'heap' 用于从空闲内存堆中分配内存。

“堆”的第一次使用可能出现在 1958 年之间,当时 John McCarthy 为 Lisp 发明了垃圾收集和 ALGOL 68 的开发

于 2009-03-19T04:01:44.390 回答
2

这是一大堆杂乱无章的垃圾,除非你确切地知道在哪里看,否则什么也找不到。

于 2009-03-19T02:59:50.530 回答
1

与堆栈相比,我一直认为这是一种描述它的聪明方式。堆就像一个杂草丛生的杂乱无章的堆栈。

于 2009-03-19T03:06:51.980 回答
0

就像 java 和 javascript 一样,heap(免费存储)和 heap(数据结构)的命名是为了确保我们的兄弟情谊不会被外人渗透,从而保证我们的工作安全。

于 2009-03-19T02:58:19.677 回答
0

堆通常具有以下特性:

  1. 您无法预测块 malloc() 返回的地址。

  2. 你不知道下一个 malloc() 返回的地址与前一个的地址有什么关系。

  3. 您可以 malloc() 可变大小的块。

所以你有一些东西可以存储一堆可变大小的块,并以一些通常不可预测的顺序返回它们。如果不是“堆”,你还会怎么称呼它?

于 2009-03-19T07:20:42.417 回答