首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中,大括号充当堆栈框架吗?

在C中,大括号充当堆栈框架吗?
EN

Stack Overflow用户
提问于 2010-05-04 00:02:25
回答 3查看 10.6K关注 0票数 156

如果我在一组新的花括号中创建了一个变量,那么该变量是在右大括号上从堆栈中弹出的,还是会一直挂到函数的末尾?例如:

代码语言:javascript
复制
void foo() {
   int c[100];
   {
       int d[200];
   }
   //code that takes a while
   return;
}

code that takes a while部分期间,d是否会占用内存?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-04 00:03:49

不,大括号不起堆栈框架的作用。在C中,大括号只表示一个命名作用域,但是当控制传递到堆栈之外时,没有任何东西会被销毁,也不会从堆栈中弹出任何东西。

作为编写代码的程序员,您通常可以将其视为堆栈框架。在大括号内声明的标识符只能在大括号内访问,因此从程序员的角度来看,它们就像是在声明它们时被推送到堆栈上,然后在退出作用域时弹出。但是,编译器不必生成在进入/退出时推入/弹出任何内容的代码(通常情况下,它们不需要)。

还要注意,局部变量可能根本不使用任何堆栈空间:它们可以保存在CPU寄存器或其他辅助存储位置,也可以完全优化。

因此,从理论上讲,d数组可能会消耗整个函数的内存。但是,编译器可能会对其进行优化,或者与使用寿命不重叠的其他局部变量共享其内存。

票数 84
EN

Stack Overflow用户

发布于 2010-05-04 00:40:49

它依赖于实现。我写了一个简短的程序来测试gcc 4.3.4做了什么,它在函数开始时一次性分配了所有的堆栈空间。您可以使用-S标志检查gcc生成的程序集。

票数 6
EN

Stack Overflow用户

发布于 2010-05-04 00:07:56

我相信它确实超出了作用域,但在函数返回之前不会从堆栈中弹出。因此,在函数完成之前,它仍将占用堆栈上的内存,但在第一个右大括号的下游不可访问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2759371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档