堆栈和堆内存实际上是作为堆栈和堆数据结构实现的吗?

时间:2016-04-20 12:09:09

标签: data-structures stack heap heap-memory stack-memory

我想知道堆栈和堆内存中引用的堆栈和堆是否实际实现为堆栈和堆数据结构?

我认为堆栈实际上是一个堆栈,它指向函数中声明的LIFO(后进先出)变量,但是我想确认并询问堆是否只是将其名称共享给动态树数据结构满足堆属性?我最近在堆栈和堆上阅读了很多内容,并且相信我理解了这个概念,然后它让我对实际实现感到好奇。我想在不同的架构上也可能有所不同,并且可能没有针对所有计算机和操作系统的具体通用答案。

如果有人遇到这个问题仍然不确定堆栈和堆的内容和位置,请参阅此问题以及我发现在学习堆栈和堆概念时有用的其他链接。

What and where are the stack and heap? http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html http://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/ https://www.youtube.com/watch?v=_8-ht2AKyH4

2 个答案:

答案 0 :(得分:2)

内存堆绝对不是堆数据结构。也就是说,它不是优先级队列。我想你可以使用优先级队列堆来构建内存堆,但是有更好的方法可以做到这一点。

堆栈......好......通常,堆栈是分配给进程的固定内存块。处理器本身将该内存块视为纯栈。也就是说,处理器的堆栈指针指向堆栈的顶部,并且推送和弹出指令按预期工作,向堆栈添加内容和从堆栈中删除内容。就这样,它是LIFO。

然而,处理器可以用堆栈做各种事情:推送和弹出不同大小的东西,直接进入它(即查看第三个项目而不会弹出前两个),等等。所以尽管处理器堆栈确实有推送和弹出指令,它还具有更多的扩展功能。我不会称之为纯粹的LIFO数据结构。

答案 1 :(得分:0)

堆内存:它不一定是堆数据结构。堆充当虚拟内存上的非固定大小的内存区域,它向程序员公开的功能是分配和释放。堆可以用各种数据结构实现。关于本机C和C ++开发,堆内存结构将由您使用的分配器定义。他们将负责管理必要的数据结构和虚拟内存。在下面的链接中,您可以看到Windows,Linux和MacOS上的默认实现:http://core-analyzer.sourceforge.net/index_files/Page335.html

堆栈内存:它不必实现为堆栈(倒数第一)数据结构,但它暴露的功能(不是程序员)是堆栈数据的形式结构体。 (处理器将操作系统给出的内存视为堆栈数据结构)它是虚拟内存上固定大小的内存区域。在现代操作系统中,堆栈将是每个线程,您也可以通过在Linux中使用ulimit来定义该限制,另一方面在Windows端,它是一个链接器参数:https://msdn.microsoft.com/en-US/library/8cxs58a6(v=vs.120).aspx

这是另一个不错的阅读:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/