免费商店的“堆”一词的由来是啥?
Posted
技术标签:
【中文标题】免费商店的“堆”一词的由来是啥?【英文标题】:What is the origin of the term "heap" for the free store?免费商店的“堆”一词的由来是什么? 【发布时间】:2010-10-14 05:39:28 【问题描述】:我正试图找到免费存储通常被称为堆的官方(或足够好的)理由。
除了它是从数据段的末尾开始增长的,我真的想不出一个好的理由,尤其是因为它与堆数据结构关系不大。
注意:很多人提到这只是一堆杂乱无章的东西。但对我来说,“堆”一词在物理上意味着一堆物理上相互依赖的东西。你从下面拉出一个,其他所有东西都会倒在上面,等等。换句话说,对我来说,堆听起来组织松散(例如,最新的东西在上面)。这并不是堆在大多数计算机上的实际工作方式,但如果你把东西放在堆的开头然后增长它,我想它可以工作。
【问题讨论】:
不要太从字面上理解“堆”。树有一个根,但在现实生活中没有。队列只能从末端提取,但在现实生活中,当人们厌倦了等待时,可以从中间离开队列。讨厌的人也可以挤进去。 空闲内存“堆”并没有崩溃(是吗?)。随着内存的分配和释放,它可能会变得碎片化。 相关帖子here 和here。 【参考方案1】:它是无序的。存储“堆”。
这不是一个有序的heap data structure。
【讨论】:
可能与有序堆栈相反。 我喜欢把它想象成一堆无序的值得一提的是,早于 C 的 ALGOL68 有一个实际的关键字 heap
,用于为“全局堆”中的变量分配空间,而不是 loc
它在堆栈上分配它。
但我怀疑它的用途可能仅仅是因为它没有真正的结构。我的意思是,你不能保证在内存中获得最合适的块或下一个块,而是你会根据分配策略的突发奇想来获取你所得到的。
像大多数名字一样,它可能是一些只需要名字的程序员想到的。
我经常听说它有时被称为竞技场(很多个月前的一条错误消息说“内存竞技场已损坏”)。这会显示内存块在地址空间内以角斗式进行战斗的图像(就像电影 Tron 一样)。
归根结底,它只是一个内存区域的名称,您也可以将其称为 brk-pool 或 sbrk-pool(在调用修改它之后)或其他十几个名称中的任何一个。
我记得甚至在 OSI 7 层模型在人们眼中闪现之前,我们就将通信协议栈放在一起时,我们使用了分层方法,并且必须在每一层为块提出名称。
我们使用了块、段、块、节和其他各种名称,所有这些都只是表示一个固定长度的东西。可能堆有相似的起源:
Carol:“嗨,Bob,对于只从大区域分配随机内存位的数据结构来说,有什么好名字?”
Bob:“‘热气腾腾的马粪堆’怎么样?”
Carol:“谢谢,Bob,如果你同意的话,我会选择‘heap’。顺便问一下,离婚的情况如何?”
【讨论】:
【参考方案3】:Knuth 拒绝将术语“堆”用作空闲内存存储的同义词。
几位作者在 1975 年左右开始将可用内存池称为“堆”。但是在本系列书籍中,我们将仅在与优先级队列相关的更传统意义上使用该词。 (基本算法,第 3 版,第 435 页)
【讨论】:
呸,高德纳。他会对数据结构了解多少? :-) 这当然是他的决定,但他是少数,尽管他很有名。 @Pax:是的,尽管 Knuth 很努力,“堆”肯定流行起来。这似乎与它在 C 内存模型中的使用有关,在 Knuth 在引用中提到的时候,这种模型已经获得了动力。 @James M:我花了相当长的时间认为内存是在堆数据结构中分配的。 时间轴: - 1968: ALGOL68 有如下声明:( int i; ref int r; loc int a; long int l; int c=1234; short int s; short short int ss; long long int ll; ~ ) AND (heap int h; ~ ) - 1972: C 有类似“ int i; int *r; auto int a; long int l; const int c=1234; static int s; extern int e; ...; - 注:我认为责怪 C 是不对的,因为 K&R(第 2 版)和 C 标准都没有在任何地方说“堆”。 C++标准只用heap
表示数据结构,将动态内存的来源称为“freestore”。【参考方案4】:
就像 java 和 javascript 一样,heap(免费存储)和 heap(数据结构)的命名是为了确保我们的兄弟情谊不会被外人所渗透,从而保证我们的工作安全。
【讨论】:
【参考方案5】:这是一大堆杂乱无章的杂物,除非你确切地知道在哪里寻找,否则什么也找不到。
【讨论】:
【参考方案6】:与堆栈相比,我一直认为这是一种描述它的巧妙方式。堆就像一个杂草丛生、杂乱无章的堆栈。
【讨论】:
【参考方案7】:我不知道它是否是第一个,但 ALGOL 68 有关键字“堆”用于从空闲内存堆中分配内存。
“堆”的第一次使用可能出现在 1958 年之间,当时 John McCarthy 为 Lisp 发明了垃圾收集和 ALGOL 68 的开发
【讨论】:
【参考方案8】:堆通常有这些特性:
您无法预测 malloc() 返回的块的地址。
你不知道下一个 malloc() 返回的地址与前一个的地址有什么关系。
您可以 malloc() 可变大小的块。
所以你有一些东西可以存储一堆可变大小的块并以一些通常不可预测的顺序返回它们。如果不是“堆”,你还怎么称呼它?
【讨论】:
根据字典,“pool”更适合统一的对象。免费商店中的块可以有不同的大小,因此不是很统一。【参考方案9】:它被命名为一个堆,因为它会让人联想到一个 stack 的对比图像。
在一堆物品中,物品按照放置顺序放在另一个上面,您只能移除最上面的一个(不会将整个物品翻倒)。
在堆中,物品的放置方式没有特定的顺序。您可以按任何顺序进入和移除项目,因为没有明确的“顶部”项目。
它很好地描述了在堆栈和堆中分配和释放内存的两种方式。嗯!
【讨论】:
虽然这个答案没有引用任何外部来源,但听起来最合理。以上是关于免费商店的“堆”一词的由来是啥?的主要内容,如果未能解决你的问题,请参考以下文章