为何新增全局静态变量后程序BSS段大小未发生增长?
问题原因解答
核心原因
你观察到BSS段大小没有变化,最主要的原因是未被使用的静态全局变量被编译器优化剔除了:
- 你代码里定义的
static int i作用域仅在当前编译单元内,且整个程序中没有任何地方对这个变量进行读/写操作,编译器的死代码消除逻辑会直接将这个无效变量从编译产物中移除,相当于你并没有定义这个变量,因此BSS段大小不会发生变化。 - 静态变量的可见性仅限于当前文件,编译器可以安全地判断它是否被使用,不需要考虑其他编译单元的引用,因此即便是在默认的低优化等级下,Windows平台常用的MSVC、MinGW-GCC等编译器都会默认开启这种未使用静态变量的消除优化。
验证方法
你可以通过修改代码2强制保留这个变量,就能观察到BSS段的变化:
- 给变量增加
volatile修饰,告诉编译器这个变量可能会被外部逻辑修改,不能优化掉:
#include<stdio.h> static volatile int i; int main() { }
- 或者在main函数中引用这个变量:
#include<stdio.h> static int i; int main() { printf("%d", i); }
重新编译后就能看到BSS段大小增加4字节(对应int类型的长度)。
补充说明
极少数情况下你可能遇到变量被保留但BSS段仍未变大的情况,这是因为BSS段存在对齐要求:
- BSS段的总大小通常会按照编译器指定的对齐粒度(一般是4字节、8字节或页大小)对齐,如果你新增的变量大小刚好占用了原来段末尾的对齐填充空位,总大小就不会发生变化,这种情况仅在新增变量非常小的时候才会出现。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

