堆栈内存是否连续?

use*_*133 20 c++ callstack memory-management

编译器如何强制堆栈内存是连续的,是否会导致在程序运行时每次都移动内存,或者在运行之前是否在程序所需的堆栈上保留内存?

Jer*_*ock 26

给定线程的堆栈在虚拟内存中通常是连续的(在Linux和类似系统上,在Windows中的用户模式下).在Windows内核(在Windows Vista及以上)z/OS的允许在虚拟内存中不连续栈和GCC 4.6也将允许.编译器根本不需要移动堆栈,即使对于堆栈具有不连续虚拟地址的系统也是如此; 他们只是改变了新零件的分配地点.操作系统可能会将物理页重新映射为虚拟页,因此堆栈在物理内存中可能不是连续的,即使它位于虚拟内存中也是如此.

  • @Merhdad:我相信如果你非常小心,有一个移动部分堆栈的技巧.据称GCC 4.6能够做到这一点:http://gcc.gnu.org/wiki/SplitStacks. (2认同)

Mar*_*ork 7

没有要求堆栈在OS或硬件的语言中是连续的.

我挑战任何人站点一个明确说明这是一个要求的参考.

现在很多实现都使用连续内存,因为它很简单.这也是如何向CS学生传授堆栈概念(堆栈增长堆积扩大).但是没有要求这样做.我相信MS甚至尝试将堆栈帧放置在堆中的随机位置,以防止攻击所使用的故意堆栈粉碎技术.

堆栈的唯一要求是链接帧.因此允许堆栈在输入/离开范围时推/弹框架.

但这一切都与原始问题正交.

编译器不会尝试强制堆栈处于连续内存中.语言级别没有要求堆栈连续的要求.

堆栈通常如何实现.

如果这是问题.然后,您将从社区获得更详细和准确的答案.

  • @Mehrdad:仔细阅读。不存在需要连续堆栈的操作系统限制。尽管操作系统供应商实现可能出于多种原因(包括但不限于效率)将其实现限制为连续堆栈。 (2认同)