C 堆栈上的本地作用域记录

C 堆栈上的本地作用域记录,c,scope,stack,C,Scope,Stack,考虑以下C函数。 打开大括号来创建局部作用域是否会使编译器在堆栈上创建一条记录来保存作用域中声明的变量 void function() { int q,r; ... { int i = 0; int j = 3; q = j + 1; } ... } 如果是这样,编译器对while块的作用是否相同 例如: void function() { int q,r; .

考虑以下C函数。
打开大括号来创建局部作用域是否会使编译器在堆栈上创建一条记录来保存作用域中声明的变量

void function()  
{  
    int q,r;
    ...
    {  
        int i = 0;
        int j = 3;  
        q = j + 1;  
    }
    ... 
}
如果是这样,编译器对while块的作用是否相同

例如:

void function()  
{  
    int q,r;
    ...    
    while(conditions)  
    {  
        int i = 0;  
        int j = 3;    
        q = j + 1;    
    }
    ... 
}

C标准未规定烟囱的布置


大括号(
{}
)引入了一个新的作用域,因此原则上是的,这可以在堆栈上创建一个新的框架。但编译器可能会选择优化这种开销。

这取决于编译器。好的现代编译器会优化这段代码。这很重要

int j = 3;
q=j+1;
在编译时

q=4;

第二个例子也是如此。变量j将被放在堆栈上,甚至可能放在寄存器中,其值设置为3,然后通过循环迭代进行处理

{}
称为复合语句(也称为块),它引入了一个新的块范围。这里的意思是:

void function(void)
{
    int q,r;
    ...

   {  
       int i = 0;
       int j = 3;  
       q = j + 1;  
   }
   ...
}

q
r
在函数结束时被销毁<代码>i和
j
在本地块范围的末尾被销毁。自动对象的生存期仅限于声明它的块

对于类似于
while
语句的迭代语句,这是完全相同的,
while
语句定义为:

while (expression) statement
如果对
中的语句使用复合语句(块),而
中的语句也将引入新的作用域


现在在堆栈级别上,C不需要堆栈,因此它需要实现细节。

根据我过去看到的行为,我会说“可能不需要”。IME中,只为所有函数的变量创建一个堆栈帧,而不管它们在函数中的作用域如何


限制范围是编译器在翻译时强制执行的;没有必要在运行时执行此操作。

因此可以在不同的记录上创建q、r和i、j?@user986437
q
r
i
j
具有不同的词法范围和不同的生存期。请注意,
中的
i
j
在循环的每次迭代中都会重新初始化。我明白了……请帮我澄清这一点。假设我有一台内存只有几kbs的电脑,在程序员创建的每个作用域中使用一条记录是否有助于大型程序在我的电脑上运行?如果内存确实有限,为每个作用域创建一个完整的堆栈帧可能会使情况变得更糟。更不用说它会造成运行时性能损失。