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

为何声明1GB静态数据后,编译出的二进制文件仅16KB?

为什么1GB全局数组编译后二进制仅16KB?

你的代码里的bytes是未初始化的全局数组,它的存储特性决定了二进制文件不会包含这1GB的实际数据,具体原因如下:

1. 全局变量的存储分段

C语言中,全局变量会根据初始化情况被分到不同的段:

  • 显式初始化的全局/静态变量 → data段:二进制文件会存储这些变量的初始值,占用文件空间。
  • 未显式初始化的全局/静态变量 → BSS段(Block Started by Symbol):二进制文件只记录这个段需要占用的内存大小,不存储实际数据。

你的char bytes[1000*1000*1000];没有显式初始化,所以属于BSS段。

2. BSS段的文件存储优化

操作系统和编译器约定,BSS段的内容在程序加载时会被自动初始化为0。因此编译生成二进制文件时,不需要把1GB的零值写入文件,只需要在文件头中标记BSS段的大小即可,这就是二进制文件只有16KB的核心原因。

3. 运行时的内存分配

当程序被操作系统加载执行时,内核会根据二进制文件中记录的BSS段大小,在进程的虚拟地址空间中分配出1GB的内存区域,并将其全部初始化为0。此时这1GB内存才真正被分配给进程,但这部分数据从未写入过二进制文件。

验证方法

可以用size命令查看二进制文件的各段大小:

size your_program

输出中会看到BSS段的大小接近1GB,而text(代码段)、data(已初始化数据段)的大小很小,总和就是你看到的16KB左右。

内容的提问来源于stack exchange,提问作者user22288295

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:04:55