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

为何给全局数组赋值会影响可执行文件大小?

问题解析:全局数组初始化方式导致可执行文件大小差异

这种现象是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:35:23