You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何新增全局静态变量后程序BSS段大小未发生增长?

问题原因解答

核心原因

你观察到BSS段大小没有变化,最主要的原因是未被使用的静态全局变量被编译器优化剔除了:

  • 你代码里定义的static int i作用域仅在当前编译单元内,且整个程序中没有任何地方对这个变量进行读/写操作,编译器的死代码消除逻辑会直接将这个无效变量从编译产物中移除,相当于你并没有定义这个变量,因此BSS段大小不会发生变化。
  • 静态变量的可见性仅限于当前文件,编译器可以安全地判断它是否被使用,不需要考虑其他编译单元的引用,因此即便是在默认的低优化等级下,Windows平台常用的MSVC、MinGW-GCC等编译器都会默认开启这种未使用静态变量的消除优化。

验证方法

你可以通过修改代码2强制保留这个变量,就能观察到BSS段的变化:

  1. 给变量增加volatile修饰,告诉编译器这个变量可能会被外部逻辑修改,不能优化掉:
#include<stdio.h>

static volatile int i;
int main() {
}
  1. 或者在main函数中引用这个变量:
#include<stdio.h>

static int i;
int main() {
    printf("%d", i);
}

重新编译后就能看到BSS段大小增加4字节(对应int类型的长度)。

补充说明

极少数情况下你可能遇到变量被保留但BSS段仍未变大的情况,这是因为BSS段存在对齐要求:

  • BSS段的总大小通常会按照编译器指定的对齐粒度(一般是4字节、8字节或页大小)对齐,如果你新增的变量大小刚好占用了原来段末尾的对齐填充空位,总大小就不会发生变化,这种情况仅在新增变量非常小的时候才会出现。

内容的提问来源于stack exchange,提问作者Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:21:02