2

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

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

我试图看一些反汇编来弄清楚,但我不太擅长阅读编译器生成的程序集(应该有一个独立的教程)

编辑:

这就是我的意思:

int main( ){

    {
        int i = 0;
    }
    return 0;
}

我知道什么是函数。我不是在谈论函数,也不是在要求任何人告诉我函数是什么。

4

4 回答 4

4

在程序离开“括号区域”后,这些变量是否从程序中释放出来?

如果变量是自动/局部变量,是的。

这会使程序更有效率吗?

可能不会,即使没有作用域,大多数现代编译器也会将代码优化为相同的效果,但明确地这样做会使您的代码更有条理。让代码的读者更直观地了解变量处于活动状态和可访问的范围。您编写的代码不仅适用于编译器,而且适用于您代码的未来用户。


每个括号{打开一个以 结尾的范围,}在该范围内声明的所有局部变量仅在该范围内保持活动状态。

例如:

void doSomething()
{
   {

       int i;
   }

}

i存在于函数内部的内部范围{ }内,并且不存在于它之外。
由于您可以使用范围控制变量的生命周期可见性{ },因此该功能也用于相同的目的。

于 2013-04-28T07:13:21.627 回答
2

嵌套范围内的自动变量在该范围之外是不可访问且无效的。从逻辑上讲,它们被销毁了;没有可移植的方式让您知道他们实际发生了什么。通过分配一个指向范围内静态变量的指针(在范围外定义),可以使范围内的静态变量在范围外访问。

限制变量的范围可以更容易地理解程序。您不必在其他地方寻找使用它们的地方。这类似于将函数设为静态;您不必在当前源文件之外查看它们的使用(除非它们用于初始化指向在文件外部引用的函数的指针)。通常没有运行时效率增益。

您可能会看到 VLA 的好处:

{
    int n = 1000;
    {
        int array1[n];
    }
    {
        int array2[n];
    }
}

在这里,您可以合理地希望编译器只为堆栈上的 1000 个整数分配空间;如果数组不在单独的范围内,则必须在堆栈上为 2000 个整数分配空间。(如果范围如图所示不相交,您可能会使用普通数组或普通变量获得“空间共享”。)

于 2013-04-28T07:19:17.513 回答
1

在回答您的问题时,代码是否会变得更有效率:很可能不会。编译器通常会将函数的所有局部变量收集在一起,并将它们定位在外部范围内。如果他们认为有充分的理由分解堆栈框架,那么他们也会对外部范围内的本地人这样做。

于 2013-04-28T07:21:32.833 回答
-1

这里变量“I”保持它的值,直到控制来自 main() 函数。

于 2013-04-28T07:50:59.197 回答