为何给全局数组赋值会影响可执行文件大小?
问题解析:全局数组初始化方式导致可执行文件大小差异
这种现象是C静态存储区变量的段分配规则与g编译器优化共同作用的结果,具体逻辑如下:
全局变量的段分配差异:
全局变量默认存放在静态存储区,编译器会根据初始化情况将其分配至不同的程序段:- 当使用
long long fib[1000001] = {};时,属于值初始化操作,数组未显式指定的元素会自动初始化为0。g++会将这类全0的全局数组分配到.bss段——该段在可执行文件中仅记录需分配的内存空间大小,不会实际存储全0数据,程序加载时由操作系统负责填充为0,因此不会显著增加可执行文件体积,保持10 KiB。 - 当使用
long long fib[1000001] = {1,1};时,数组前两个元素被显式设为1,剩余999999个元素会被值初始化为0,但此时数组并非全0。编译器无法将其放入.bss段,只能分配到.data段——该段会把所有初始化数据(包括默认填充的0)完整写入可执行文件。按数组规模计算:1000001个long long元素(每个占8字节),总数据量约7.6 MiB,这就是可执行文件大小增至7 MiB的原因。
- 当使用
仅全局变量出现该现象的原因:
局部变量存储在栈上,初始化操作在程序运行时完成,不会影响可执行文件的磁盘存储大小;而全局/静态变量的存储由编译器在编译阶段安排到不同段,才会直接改变可执行文件的体积。
代码示例:
long long fib[1000001] = {1,1}; // 7 MiB,存入.data段
long long fib[1000001] = {}; // 10 KiB,存入.bss段
内容的提问来源于stack exchange,提问作者Matian
相关产品推荐
相关产品推荐

