如果我有c功能
int foo(int input)
{
int x = 5;
if( input == 0 ){
int y = 6;
} else {
int z = 7;
}
}
我知道当我们输入函数时会调整堆栈指针,这会为int x
语句腾出空间。我知道y
和z
仅存在于各自块的范围内。但是他们何时以及如何分配空间?
答案 0 :(得分:6)
这取决于编译器,只要空间至少持续变量的生命周期。
通常,函数中所有自动变量的空间在函数开头的堆栈上分配,并在函数返回时释放。如果某些变量不需要地址,则可以将它们放在寄存器中。您的变量可能根本不存在,因为它们从未被使用过。
更新:如评论中所述,C(但尚未使用C ++)允许动态调整大小的本地数组。显然,在知道尺寸之前,不能分配这些空间。
答案 1 :(得分:0)
int foo(int input)
{ // BLOCK 1
int x = 5;
if( input == 0 )
{ // BLOCK 2
int y = input * (x + 6);
// other code here
}
else
{ // BLOCK 3
int z = input + x;
// other code here
}
}
编译器能够优化大部分内容,但高级语言规则是这样的:
x
在BLOCK 1
和所有子块(BLOCK 2
和BLOCK 3
)中有效。
y
仅在BLOCK 2
中有效。
z
仅在BLOCK 3
中有效。
编译器发出的第一遍通常会保留这些规则。后续传递通常会看到您没有使用变量(或优化它们的使用方式)并可能会移动它们或者根本不将它们存储在内存中(例如它们可能只是放在寄存器中),所以试图将它们等同起来高级语言中的范围如何在汇编中进行优化是一个愚蠢的错误。