我注意到你可以在括号中包含随机代码块,它会将所有声明的变量本地化。
我的问题是,在程序离开“括号区”后,这些变量是否从程序中解放出来?我的意思是,它们是否在堆栈上创建和销毁,类似于函数?
我试着去看一些解决方案来解决它,但是我不太擅长阅读编译器生成的程序集(应该有一个独立的教程)
编辑:
这就是我的意思:
int main( ){
{
int i = 0;
}
return 0;
}
我知道有什么功能。我不是在谈论功能,我不是要求任何人告诉我功能是什么。
答案 0 :(得分:4)
程序离开“括号区”后这些变量是否从程序中解放出来?
如果变量是自动/局部变量,则为是。
这会使程序更有效吗?
可能不是,即使没有范围,大多数现代编译器也会优化代码以达到相同的效果,但明确地这样做可以使代码更有条理。对于代码的读者来说,更直观地了解变量的存活和可访问范围。您编写的代码不仅适用于编译器,也适用于代码的未来用户。
每个括号{
打开一个以}
结尾的范围,在范围内声明的所有局部变量仅在该范围内保持活动状态。
例如:
void doSomething()
{
{
int i;
}
}
i
位于函数内部范围{ }
内,并且不存在于其中
由于您可以使用范围{ }
控制变量的生命周期和可见性,因此该功能也可用于此。
答案 1 :(得分:2)
嵌套作用域中的自动变量在该作用域外无法访问且无效。从逻辑上讲,它们被摧毁了;没有可移植的方式来告诉他们实际发生了什么。通过指定指向范围内的静态变量的指针(在范围外定义),可以在范围外访问范围中的静态变量。
限制变量的范围使得理解程序变得更容易。您不必在其他地方寻找使用它们的地方。这类似于使函数静态;您不必在当前源文件之外查看它们的使用(除非它们用于初始化指向文件外部引用的函数的指针)。通常没有运行时效率增益。
您可能会看到使用VLA的好处:
{
int n = 1000;
{
int array1[n];
}
{
int array2[n];
}
}
在这里,您可以合理地希望编译器仅在堆栈上为1000个整数分配空间;如果数组不在单独的范围内,则必须为堆栈上的2000个整数分配空间。 (如果范围如图所示不相交,你可能会与普通数组或普通变量进行“空间共享”。)
答案 2 :(得分:1)
如果代码变得更有效率,则回答您的问题:很可能不会。编译器通常会将函数的所有局部变量收集在一起,并将它们放在外部作用域中。如果他们看到打破堆栈框架的充分理由,那么他们也会在外部范围内使用本地人。
答案 3 :(得分:-1)
这里变量“I”保持其值,直到控制来自main()函数。