如果我有交流功能
int foo(int input)
{
int x = 5;
if( input == 0 ){
int y = 6;
} else {
int z = 7;
}
}
我知道当我们进入函数时,堆栈指针会被调整,从而为int x
语句腾出空间。而且我知道,y
并且z
只存在于各自区块的范围内。但是何时以及如何为他们分配空间?
这取决于编译器,只要空间至少持续变量的生命周期。
通常,函数中所有自动变量的空间在函数开始时在堆栈上分配,并在函数返回时释放。如果某些变量不需要有地址,它们可能会放在寄存器中。您的变量可能根本不存在,因为它们从未被使用过。
更新:如评论中所述,C(但还不是 C++)允许动态大小的本地数组。显然,在知道大小之前无法分配这些空间。
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
。
编译器进行的第一遍通常会保留这些规则。随后的传递通常会看到您没有使用变量(或优化它们的使用方式),并且可能会移动它们或根本不将它们存储在内存中(例如,它们可能只是放在寄存器中),因此尝试将它们等同起来高级语言的范围到如何在汇编中进行优化是一件傻事。