如果之前有人问过这个问题,我很抱歉,但我没有找到任何东西......
对于“普通”x86 架构:
当我在 C++ 中调用一个大函数时,是否会立即为所有堆栈变量分配内存? 或者是否有编译器可以(并且确实)修改堆栈大小,即使函数未完成。
例如,如果一个新的作用域开始:
int largeFunction(){
int a = 1;
int b = 2;
// .... long code ....
{ // new scope
int c = 5;
// .... code again ....
}
// .....
在单独范围的开头,变量 c 的调用堆栈是否也“增长”并在其末尾“收缩”? 或者当前的编译器是否总是会产生影响函数入口处的堆栈指针和返回值的代码? 提前感谢您的回答。
最佳答案
1) 一个函数有多长与分配内存无关,与栈或堆无关。
2) 何时“分配”堆栈仅取决于编译器生成最高效代码的方式。 “高效”的要求范围很广。所有编译器都可以选择修改速度和大小的优化器目标,大多数编译器还可以优化以降低堆栈消耗和其他参数。
3) 自动变量可以入栈,但这不是必须的。许多变量应该“分配”到您的 cpu 寄存器。这大大加快了代码速度并节省了堆栈。但这在很大程度上取决于 cpu 平台。
4) 编译器什么时候生成新的栈帧也是代码优化的问题。如果这样可以节省资源或更适合架构,编译器可以执行“乱序执行”。因此无法回答何时使用堆栈框架的问题。新作用域(左大括号)可以是分配新堆栈帧的点,但这绝不是保证。有时,重新计算实际作用域中所有被调用函数的所有堆栈相对地址效率不高。
5) 一些编译器也可以将堆内存用于自动变量。如果通过特殊指令访问作为堆栈相对寻址更快,这在嵌入式内核上很常见。
但通常情况下,编译器何时执行他想要的操作并不是很重要。有时唯一要记住的是,你必须保证你的堆栈足够大。新线程的系统调用通常有参数来设置堆栈大小。所以你必须知道你的实现需要多少堆栈大小。但在所有其他情况下:忘记考虑。您的编译器开发人员可以完美地完成这项工作。
关于c++ - 堆栈内存可以在函数内自动分配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301963/