栈和堆内存实际上是作为栈和堆数据结构实现的吗?
Are stack and heap memory actually implemented as stack and heap data structures?
想知道栈和堆内存中所指的栈和堆是否真的实现为栈和堆数据结构?
我认为堆栈实际上是一个堆栈,它具有指向函数中声明的 LIFO(后进先出)变量的指针,但是我想确认并询问堆是否不仅与动态树共享其名称满足堆属性的数据结构?我最近阅读了很多关于堆栈和堆的文章,相信我理解了这个概念,但是它让我对实际的实现感到好奇。我想它在不同的体系结构上也可能有所不同,并且可能没有针对所有计算机和 OS 的特定通用答案。
如果有人遇到这个问题但仍然不确定堆栈和堆是什么以及在哪里,请查看这个问题和我发现对学习堆栈和堆概念有用的其他链接。
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
内存堆绝对不是堆数据结构。也就是说,它不是优先队列。我想您可以使用优先级队列堆来构建内存堆,但还有更好的方法。
堆栈是...嗯... 通常,堆栈是分配给进程的固定内存块。处理器本身将该内存块视为纯堆栈。也就是说,处理器的栈指针指向栈顶,push 和 pop 指令按预期工作,在栈中添加和移除内容。这样,就是后进先出。
然而,处理器可以用堆栈做各种事情:压入和弹出不同大小的东西,直接向其中寻址(即查看第三项而不弹出前两项),等等。所以尽管处理器堆栈确实有 push 和 pop 指令,它也有更多的扩展功能。我不会称它为纯后进先出数据结构。
堆内存 : 不一定是堆数据结构。堆用作虚拟内存上的非固定大小的内存区域,它向程序员公开的功能是分配和释放。堆可以用各种数据结构来实现。对于原生 C 和 C++ 开发,堆内存结构将由您使用的分配器定义。他们将负责管理必要的数据结构和虚拟内存。在下面的 link 中,您可以看到 Windows、Linux 和 MacOS 上的默认实现:http://core-analyzer.sourceforge.net/index_files/Page335.html
堆栈内存:它不必作为堆栈(先进后出)数据结构来实现,但是它公开的功能(不是对程序员)是栈数据结构的形式。 (处理器会把操作系统给的那块内存当作一个栈数据结构)它是虚拟内存上一块固定大小的内存区域。在现代操作系统中,堆栈将是每个线程,您还可以通过在 Linux 中使用 ulimit 来定义该限制,另一方面在 Windows 方面它是一个 linker 参数: https://msdn.microsoft.com/en-US/library/8cxs58a6(v=vs.120).aspx
这里还有另一本不错的读物:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
想知道栈和堆内存中所指的栈和堆是否真的实现为栈和堆数据结构?
我认为堆栈实际上是一个堆栈,它具有指向函数中声明的 LIFO(后进先出)变量的指针,但是我想确认并询问堆是否不仅与动态树共享其名称满足堆属性的数据结构?我最近阅读了很多关于堆栈和堆的文章,相信我理解了这个概念,但是它让我对实际的实现感到好奇。我想它在不同的体系结构上也可能有所不同,并且可能没有针对所有计算机和 OS 的特定通用答案。
如果有人遇到这个问题但仍然不确定堆栈和堆是什么以及在哪里,请查看这个问题和我发现对学习堆栈和堆概念有用的其他链接。
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
内存堆绝对不是堆数据结构。也就是说,它不是优先队列。我想您可以使用优先级队列堆来构建内存堆,但还有更好的方法。
堆栈是...嗯... 通常,堆栈是分配给进程的固定内存块。处理器本身将该内存块视为纯堆栈。也就是说,处理器的栈指针指向栈顶,push 和 pop 指令按预期工作,在栈中添加和移除内容。这样,就是后进先出。
然而,处理器可以用堆栈做各种事情:压入和弹出不同大小的东西,直接向其中寻址(即查看第三项而不弹出前两项),等等。所以尽管处理器堆栈确实有 push 和 pop 指令,它也有更多的扩展功能。我不会称它为纯后进先出数据结构。
堆内存 : 不一定是堆数据结构。堆用作虚拟内存上的非固定大小的内存区域,它向程序员公开的功能是分配和释放。堆可以用各种数据结构来实现。对于原生 C 和 C++ 开发,堆内存结构将由您使用的分配器定义。他们将负责管理必要的数据结构和虚拟内存。在下面的 link 中,您可以看到 Windows、Linux 和 MacOS 上的默认实现:http://core-analyzer.sourceforge.net/index_files/Page335.html
堆栈内存:它不必作为堆栈(先进后出)数据结构来实现,但是它公开的功能(不是对程序员)是栈数据结构的形式。 (处理器会把操作系统给的那块内存当作一个栈数据结构)它是虚拟内存上一块固定大小的内存区域。在现代操作系统中,堆栈将是每个线程,您还可以通过在 Linux 中使用 ulimit 来定义该限制,另一方面在 Windows 方面它是一个 linker 参数: https://msdn.microsoft.com/en-US/library/8cxs58a6(v=vs.120).aspx
这里还有另一本不错的读物:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/