通常的做法是在函数的入口点声明堆栈变量(在执行堆栈上分配的变量而不是动态或静态),而不是与函数内的指令混合。参见实施例1.a和1.b.这有助于提高可读性,甚至还需要使用旧语言。
使用现代C / C ++,不再需要它(但仍然是良好的实践)。
我的问题:如果堆栈变量在函数内部而不是在入口点,编译器如何解决它。参见例子2.a和2.b我怎么能想象他解决了它。什么是实际发生?
1.a)示例(通用实践/最佳实践)
void main()
{
int a = 3; // best practice
bool c = false; // best practice
a += 16;
if(a == 5)
{
c=false;
}
}
...而不是 ...
1.b)例子(罕见)
void main()
{
int a = 3;
a += 16;
bool c = false; // variable after some instructions executed..
if(a == 5)
{
c=false;
}
}
2.a)可能的编译器解决方案(A)
void main()
{
int a = 3;
a += 16;
bool c = false; // COMPILER CUTS THIS LINE AND MOVES IT UP UNDER "int a = 3;"
if(a == 5)
{
c=false;
}
}
2.B)可能的编译器解决方案(B)
void main()
{
int a = 3;
a += 16;
{ // COMPILER ADDS SUBSECTION IN ORDER TO INTRODUCE NEW VARIABLES ON STACK
bool c = false;
if(a == 5)
{
c=false;
}
}
}
编译器实例化或分配此类变量的时间,方式和位置完全取决于实现。它可以在函数开始时为所有变量创建一个堆栈帧,或者它可以在声明点扩展堆栈帧,或者它可能根本不使用堆栈而是使用寄存器存储。
该语言只要求实现正确的语义;在声明变量之前,变量不在范围内(即不能被代码引用),并且范围在声明它的块的结束}
之后结束。