在 C 语言的函数中,我知道堆栈通常用于存储传递给函数的参数以及函数的局部变量。我知道这是编译器和平台相关的,因为也可以使用寄存器,但我们假设在这种情况下仅使用堆栈。
无论局部变量在函数内的何处定义,通常都会在堆栈上为局部变量保留空间吗?
例如,如果我们在函数中有一个 if 条件,当它为 true 时,变量将在 if 块内定义。是否只有在进入区块时才调用push()操作,而在离开区块时才调用pop()操作?
或者无论 if 条件是否成立,堆栈上都会为这些变量保留空间?
嗯,这完全是实现定义的。让我们忽略任何有关优化的内容,并根据标准 C 来解释这个问题。
首先,C 标准没有指定任何有关内存布局的内容。因此,实现(即,编译器)可以选择任何方式为对象(即,变量)分配内存空间,只要它们遵守生命周期约束。
对象的生命周期是程序执行的一部分,在此期间保证为其保留存储空间。
在
if
语句中定义的对象(不带static
和thread_local
说明符)具有“自动存储持续时间”,其生命周期从进入块开始到离开块结束。
因此,“自动存储时长对象的内存空间是提前分配还是及时分配”的答案完全取决于实现。
在实践中,“局部变量”通常会提前分配(即使在古老的
x86
ISA中,例如8086)。但对于VLA来说,它们只能及时分配。如果您确实想了解特定实现下的行为,只需参考其文档(例如 GCC 的用户手册和内部文档)。