代码之家  ›  专栏  ›  技术社区  ›  Uri

自由存储“堆”一词的由来是什么?

  •  22
  • Uri  · 技术社区  · 16 年前

    我试图找到一个官方的(或足够好的)理由,免费存储通常被称为堆。

    除了它从数据段的末尾开始增长之外,我真的想不出一个好的理由,特别是因为它与堆数据结构几乎没有关系。

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

    9 回复  |  直到 7 年前
        1
  •  33
  •   Bill the Lizard    16 年前

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

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

        2
  •  17
  •   paxdiablo    7 年前

    值得一提的是,在C之前的algol68 关键字 heap 它用于为“全局堆”中的变量分配空间,而不是 loc 在堆栈上分配了它。

    但我怀疑这可能只是因为它没有真正的结构。我的意思是,你不能保证在内存中得到最合适的块或下一个块,相反,你将根据分配策略的突发奇想得到你得到的。

    像大多数名字一样,可能是某个编码人员想到的,他只需要一个名字。

    我经常听说它有时被称为竞技场(许多卫星之前的一条错误消息称“记忆竞技场已被破坏”)。这会在你的地址空间(一部电影《创世纪》)中以角斗士的方式呈现出记忆的片段。

    总之,它只是一个内存区域的名称,您也可以将其称为BRK池或SBRK池(在调用修改它之后),或者其他十几个名称中的任何一个。

    我记得当我们把通信协议栈放在一起的时候,甚至在OSI 7层模型在别人眼里闪烁之前,我们使用了分层的方法,并且必须在每个层为这些块提供名称。

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

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

    鲍勃:“蒸马粪怎么样?”

    卡罗尔:“谢谢,鲍勃,如果你同意的话,我就选择‘堆’。”顺便问一下,离婚怎么样了?”

        3
  •  16
  •   thomasrutter    12 年前

    它被命名为一个堆,因为它让人联想到一个 堆栈 .

    • 在一堆项目中,项目按其放置的顺序一个接一个地放置在另一个项目上,您只能移除顶部的项目(而不将整个项目倾倒)。

      Stack like a stack of papers

    • 在堆中,项目的放置方式没有特定的顺序。您可以按任何顺序访问和删除项目,因为没有明确的“top”项目。

      Heap like a heap of licorice allsorts

    它非常好地描述了在堆栈和堆中分配和释放内存的两种方法。百胜!

        4
  •  3
  •   S.Lott    16 年前

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

    这不是命令 heap data structure .

        5
  •  3
  •   Arnold Spence    16 年前

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

    “heap”的首次使用可能出现在1958年,当时约翰·麦卡锡发明了Lisp的垃圾收集和algol 68的开发。

        6
  •  2
  •   Crashworks    16 年前

    这是一大堆杂乱无章的垃圾,如果你不知道该往哪里看,什么都找不到。

        7
  •  1
  •   James McMahon    16 年前

    就像Java和JavaScript一样,堆(自由存储)和堆(数据结构)被命名为确保我们的友爱对局外人是不可穿透的,从而保证我们的工作安全。

        8
  •  1
  •   Jon B    16 年前

    我一直认为与堆栈相比,它是一种很巧妙的描述方法。堆就像一个过度生长、无序的堆栈。

        9
  •  0
  •   sharptooth    16 年前

    堆通常具有以下特性:

    1. 不能预测块malloc()返回的地址。

    2. 您不知道下一个malloc()返回的地址如何与前一个malloc()的地址相关。

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

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

    推荐文章