我正在尝试通过实现书籍中的一些内容来学习更多关于虚拟机和编程语言的知识。我正在阅读的这本书将堆栈和堆保存在一个内存区域中。堆栈向上增长,堆向下增长。我想知道这有什么好处,除了可能是一个更简单的加载/存储操作策略,因为你不需要区分两个不同的内存区域。
我问的原因是因为我正在考虑偏离书中的计划,并为堆栈和堆提供两个不同的内存区域。这对我来说似乎更有意义,我不必担心堆栈和堆寄存器相互碰撞。
答案 0 :(得分:1)
好吧,在内存有限且没有虚拟内存的旧机器上,内存的两个部分代表机器可用空间的两个相对端。如果你有48k的连续空间,一端是堆栈向上增长,另一端是堆向下增长。最终他们发生碰撞,你“失去记忆”。
这就是灵感的来源。现代机器肯定不会受到内存挑战(必然),并且您拥有VM系统来帮助隔离堆和堆栈等不同的部分。那么你没有真正的理由在一个人“成长”而在另一个人“长大”。而是将它们分配到所需的大小,然后开始成长直到你用完为止。
当然,当然,今天,使用VM可以控制堆栈上的执行(甚至是堆区域)。在过去较小的旧机器上,这不是一个真正的问题。
答案 1 :(得分:1)
我想知道这个的好处是什么,而不是一个 加载/存储操作的简单策略(...)
好处是你不需要虚拟内存,这使得这个概念适用于最简单的CPU /架构。此外,您不需要一个操作系统来跟踪内存区域及其对程序的分配。换句话说,这种实现非常适合于例如小型 embedded systems通常没有(也不需要)现代桌面或服务器CPU的处理能力。
(...)因为您不需要区分两个不同的内存区域。
我认为内存区域是指多个共存内存空间的概念,这些内存空间是分开的,每个内存空间都有一个相对索引(0, ..., n)
的地址范围,其中n是最大数量该区域的字节数。
如果你有virtual memory那就很有意义,那就是CPU在物理内存之上实现了一个层,它给程序带来了每个都有一个单独的,有条件的内存空间的错觉。