使用size命令分析C程序内存段:全局变量引发bss段异常问题解析
关于size命令分析C内存存储段的两个问题解答
现象1:编译为可执行文件(.exe)后bss段未增长
- 未使用变量被链接器剔除:如果新增的全局未初始化变量
glb在代码里没有被任何逻辑引用,链接器会触发死数据消除优化,直接把这个未被使用的变量从最终可执行文件中移除,自然不会让bss段的统计值增长。 - 可执行文件的bss段特性:以Windows的PE格式为例,bss段在磁盘上并不实际占用存储空间,它只是记录程序加载到内存时需要分配的内存大小。
size命令对exe的bss统计可能包含了链接器预设的固定开销(比如一些运行时初始化需要的空间),单个小变量的空间变化可能被这些固定值覆盖,或者链接器对微小的bss调整做了合并处理。
现象2:目标文件中bss段增长16而非预期的4
- 内存对齐机制:编译器为了提升CPU的内存访问效率,会对全局变量的存储做对齐处理。在多数32位或64位编译环境中,默认的对齐规则是16字节对齐。当你新增一个4字节的
int类型变量glb时,编译器会自动填充额外的字节,让整个bss段的总大小满足16字节的对齐要求,最终导致bss段的增长值是16而非4。 - 目标文件的原始性:目标文件(.obj)是编译后的中间产物,还没经过链接器的优化和合并操作,会如实记录编译器为变量分配的所有空间(包括对齐填充的字节),所以能看到对齐带来的空间变化。
内容的提问来源于stack exchange,提问作者Emre
相关产品推荐
相关产品推荐

