4

在 C++ 程序执行期间,特定函数的堆栈帧是否始终具有恒定大小,或者在某些情况下允许编译器进行动态堆栈管理,类似于 alloca() 函数的功能?为了更好地描述它,我的意思是堆栈帧中特定局部变量或对象的偏移量可能会在函数的不同执行时发生变化

4

4 回答 4

3

至少在大多数典型的实现中,可变参数函数的堆栈帧会根据传递的变量数量而变化。例如:

printf("%d", 1); // stack frame contains 1 pointer, one int
printf("%d %d", 1, 2); // stack frame contains one pointer, 2 ints.

实现是否特别相似alloca取决于实现(特别是因为alloca它不是标准的,所以实现的方式或什至可能会有所不同)。

于 2013-07-02T15:25:02.277 回答
3

编译器可以按照自己的意愿去做,毕竟它会生成代码并且只要它按照 C++ 中的程序所说的去做就可以了。一般来说,只要有可能,编译器就会计算函数所需的总堆栈空间并预先保留(减少写入堆栈寄存器的次数),即使对象是按需创建和销毁的。

于 2013-07-02T15:42:20.433 回答
1

该标准没有说明任何内容(它甚至不需要你有一个堆栈),并且对于 C++14,可能需要像 alloca 这样的东西,因为它可能会获得 C99 VLA 的“轻量级”版本。

于 2013-07-02T15:22:11.530 回答
1

在常见的实现中,局部变量被放置在堆栈帧上。一些函数可能具有由寄存器容纳的变量,而另一些函数则将变量放在堆栈上。

堆栈帧也可以由语句块中声明的非静态变量扩展。

堆栈帧没有标准的最小尺寸。堆栈帧的最大大小取决于平台和实现。一个常见的实现是让栈向堆扩展,堆向栈扩展。

于 2013-07-02T16:12:44.787 回答