C语言内存布局Size Variation疑问:静态变量分配异常解析
C语言data与bss段变量分配异常现象解释
问题代码
#include <stdio.h> static int i; int main() { return 0; }
命令行执行结果
PS E:\Programs\C\Programmieren in C> size file_16.exe text data bss dec hex filename 2957 1928 480 5365 14f5 file_16.exe PS E:\Programs\C\Programmieren in C> gcc file_16.c -o file_16.exe PS E:\Programs\C\Programmieren in C> size file_16.exe text data bss dec hex filename 2957 1928 448 5333 14d5 file_16.exe
将静态变量i初始化为24重新编译后,bss段大小减少32字节而非预期的4字节、data段无变化的现象,可从以下几点解释:
1. 内存对齐机制
CPU访问内存时遵循特定对齐规则(通常为8或32字节,取决于架构与编译选项),以此提升访问效率。链接器分配段空间时不会单独调整单个4字节变量的占用,而是以对齐块为单位操作。当i从bss段移至data段时,链接器释放的是i所在的整个32字节对齐块,而非仅变量本身的4字节。
2. PE文件的节分配规则
Windows平台下GCC生成的是PE格式可执行文件,段以**节(Section)**为单位划分。节的大小按内存页或更小的对齐单元(如32字节)分配,不存在小于最小对齐单元的节空间。静态变量i原本占据bss节中的一个32字节对齐块,移除后链接器直接回收该块,导致bss段总大小减少32字节。
3. data段无变化的原因
初始化后的静态变量i被放入data段时,链接器将其合并到了data节已有的空闲对齐间隙中,未触发data节的扩容操作,因此data段总大小未出现明显变化。
内容的提问来源于stack exchange,提问作者wdl4076
相关产品推荐
相关产品推荐

