如果我在一组新的大括号内创建一个变量,该变量是从右大括号的堆栈中弹出的,还是一直挂到函数结束?例如:

void foo() {
   int c[100];
   {
       int d[200];
   }
   //code that takes a while
   return;
}

code that takes a while部分,d会占用内存吗?

推荐答案

不,大括号不充当堆栈框架.在C语言中,大括号只表示一个命名范围,但当控件从堆栈中传出时,没有任何内容被 destruct ,也没有任何内容从堆栈中弹出.

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

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

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

C++相关问答推荐

执行自动聚焦规则后的CLIPS聚焦模块

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

malloc实现:判断正确的分配对齐

标准的C17标准是用括号将参数包装在函数声明中吗

为什么可以在typedef之前使用typedef d struct 体?

如何调试LD_PRELOAD库中的构造函数?

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

进程已完成,退出代码为138 Clion

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

在C语言中,是否可以使枚举数向后计数?

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

如何在VS 2022中正确安装额外的C头文件

在C语言中,指针指向一个数组

分支预测和UB(未定义的行为)

从系统派生线程调用CRT

将char*铸造为空**

与指针的原始C数组或C++向量<;向量<;双>>;