use*_*133 20 c++ callstack memory-management
编译器如何强制堆栈内存是连续的,是否会导致在程序运行时每次都移动内存,或者在运行之前是否在程序所需的堆栈上保留内存?
Jer*_*ock 26
给定线程的堆栈在虚拟内存中通常是连续的(在Linux和类似系统上,在Windows中的用户模式下).在Windows内核(在Windows Vista及以上)和z/OS的允许在虚拟内存中不连续栈和GCC 4.6也将允许.编译器根本不需要移动堆栈,即使对于堆栈具有不连续虚拟地址的系统也是如此; 他们只是改变了新零件的分配地点.操作系统可能会将物理页重新映射为虚拟页,因此堆栈在物理内存中可能不是连续的,即使它位于虚拟内存中也是如此.
没有要求堆栈在OS或硬件的语言中是连续的.
我挑战任何人站点一个明确说明这是一个要求的参考.
现在很多实现都使用连续内存,因为它很简单.这也是如何向CS学生传授堆栈概念(堆栈增长堆积扩大).但是没有要求这样做.我相信MS甚至尝试将堆栈帧放置在堆中的随机位置,以防止攻击所使用的故意堆栈粉碎技术.
堆栈的唯一要求是链接帧.因此允许堆栈在输入/离开范围时推/弹框架.
编译器不会尝试强制堆栈处于连续内存中.语言级别没有要求堆栈连续的要求.
如果这是问题.然后,您将从社区获得更详细和准确的答案.