【发布时间】:2013-10-18 13:53:39
【问题描述】:
如果之前有人问过这个问题,我很抱歉,但我没有找到任何东西......
对于“普通”x86 架构:
当我在 C++ 中调用一个大函数时,是否会立即为所有堆栈变量分配内存? 或者是否有编译器可以(并且确实)修改堆栈大小,即使函数没有完成。
例如,如果一个新的范围开始:
int largeFunction(){
int a = 1;
int b = 2;
// .... long code ....
{ // new scope
int c = 5;
// .... code again ....
}
// .....
}
对于变量 c 的调用堆栈是否也可以在单独作用域的开头“增长”并在其结尾“收缩”? 还是当前的编译器总是会生成影响函数入口和返回值的堆栈指针的代码? 提前感谢您的回答。
【问题讨论】:
-
大多数编译器都有保存生成的程序集文件的选项。试试看,看看他们做了什么。我敢打赌,如果你有一个分配大数组的
if块,它只会在测试成功时增加堆栈帧。 -
您为什么需要知道这些?我想这是依赖于实现的,因此依赖于任何特定行为的代码既不便携也不符合标准。换句话说,作为 C++ 程序员,您不必担心这一点。
-
堆栈大小是固定的。但这只是虚拟内存,用于堆栈的 RAM 肯定会动态增长。按需页面虚拟内存操作系统的标准功能。
-
@walter:即使你不必依赖它,了解你工作所在的抽象层下的抽象层也能让你更好地理解你工作的那个。
-
@mbratch:OTOH 动态调整堆栈大小会增加额外的簿记指令,从而增加代码大小和程序运行时间。
标签: c++ c memory-management stack