在C ++程序执行期间,特定函数的堆栈帧是否总是具有常量大小,或者在某些情况下允许编译器执行动态堆栈管理,类似于alloca()函数的作用?更好地描述它我的意思是堆栈帧中特定局部变量或对象的偏移量可能会在函数的不同执行时发生变化
答案 0 :(得分: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
不是标准的,所以如何实现甚至实现可能会有所不同)。
答案 1 :(得分:3)
允许编译器按照自己的意愿执行,毕竟它生成代码,只要它执行C ++中的程序说它没问题。通常,只要有可能,编译器就会计算函数所需的总堆栈空间并预先保留(减少堆栈寄存器写入的次数),即使对象是按需创建和销毁的。
答案 2 :(得分:1)
该标准没有说明任何内容(它甚至不需要你有一个堆栈),而C ++ 14可能需要像alloca这样的东西,因为它可能会获得C99 VLA的“轻型”版本
答案 3 :(得分:1)
在通常的实现中,局部变量被放置在堆栈帧上。某些函数可能具有由寄存器容纳的变量,其他函数可能具有放置在堆栈上的变量。
堆栈帧也可以通过语句块中声明的非静态变量进行扩展。
堆栈帧没有标准的最小大小。堆栈帧的最大大小取决于平台和实现。一个常见的实现是让堆栈向堆扩展,堆扩展到堆栈。