在.NET (据我所知,还有Java )中,动态分配对象的区域称为托管堆。但是,描述托管堆工作方式的大多数文档将其描述为线性数据结构,例如链接列表或堆栈。
那么,托管堆实际上是一个堆,还是用其他数据结构实现的呢?如果它实际上不使用堆数据结构,那么似乎是术语的重大失误,无法使这个词的意思过载。
如果它实际上是堆数据结构,那么满足堆属性的值是什么:分配的内存区域的大小?
发布于 2011-01-08 19:44:58
不,堆根本不是堆序二叉树。(对我来说)术语冲突是谁的错还不清楚,但这两种堆的使用都可以追溯到几十年前(它似乎是1970年中期)。在这篇文章中讨论了一些历史。
发布于 2011-01-08 19:51:13
我当然没有足够的历史知识对此发表任何权威的评论,但我认为,用于描述.NET和Java中更长寿命对象的内存分配机制的“堆”一词更像是一种唤起性的、描述性的词,它是一种大型的非结构化内存(从dev的角度来看),它是存在大量内存的地方。相反,“堆栈”则唤起了一个更结构化的数据区域的映像(同样,从开发人员的角度来看):“在堆栈上”的东西感觉比“它们生活在堆上的地方”更相关。
这与实际的堆数据结构非常不同,它使用“堆”一词来指所谓的堆属性(来自维基百科):
如果B是A的子节点,则键(A)≥键(B)。
所以是的,它们实际上是不相关的。一个只是一个描述性的术语,而另一个则有一个更为正式的定义。
发布于 2011-01-08 19:50:07
从这个意义上说,“堆”是指用于存储重要资源的特殊内存区域。在这种情况下,它与“堆数据结构”无关。
https://stackoverflow.com/questions/4635758
复制相似问题