通常的做法是在函数的入口点声明堆栈变量(在执行堆栈上分配的变量,而不是动态或静态分配的变量),而不是与函数内部的指令混合。 参见示例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;
}
}
}
答案 0 :(得分:2)
编译器何时,如何以及在何处实例化或分配此类变量完全取决于实现。它可以在函数开始时为所有变量创建一个堆栈框架,或者可以在声明时扩展堆栈框架,或者可以完全不使用堆栈,而使用寄存器存储。
该语言仅要求实现正确的语义;在声明变量之前,该变量不在作用域内(即不能被代码引用),并且作用域在声明该变量的块的结束}
之后结束。 / p>