关于C编译中的括号

时间:2013-04-28 07:11:14

标签: c compilation

我注意到你可以在括号中包含随机代码块,它会将所有声明的变量本地化。

我的问题是,在程序离开“括号区”后,这些变量是否从程序中解放出来?我的意思是,它们是否在堆栈上创建和销毁,类似于函数?

我试着去看一些解决方案来解决它,但是我不太擅长阅读编译器生成的程序集(应该有一个独立的教程)

编辑:

这就是我的意思:

int main( ){

    {
        int i = 0;
    }
    return 0;
}

我知道有什么功能。我不是在谈论功能,我不是要求任何人告诉我功能是什么。

4 个答案:

答案 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()函数。