int t [1000000] = {1,2,3};产生一个大的二进制文件,为什么?

时间:2017-10-29 18:35:16

标签: c++ g++

int t[1000000];
int main(){}

当使用g ++编译时,此代码(作为.cpp文件)生成一个小二进制文件。如果我稍后使用数组t,它将把它的所有元素设置为0。

int t[1000000]={1,2,3};
int main(){}

即使使用优化大小(-Os)进行编译,也会产生一个接近4M大的二进制文件。除了t [0],t [1]和t [2]分别设置为1,2和3之外,数组t与第一个例子中的相同。为什么存储这三个数字需要这么多额外的文件大小?
在linux上测试,gcc版本5.4.0

1 个答案:

答案 0 :(得分:3)

具有静态存储持续时间的零初始化数据通常非常有效地存储在可执行文件中。它几乎不占用磁盘上的空间。可执行文件包含几个单词,表示它需要多少个零初始化字节以及哪个地址,以及它。

另一方面,静态初始化数据存储为表示其值的文字字节,如果这些字节中的大多数为零,则无关紧要。定义可执行格式,使其需要物理存储所有这些格式。没有规定" 1,2,3,其余为零"以节省空间的方式。

当可执行文件加载到RAM中时,加载程序为零初始化数据分配所需的内存量,并用零值字节填充它,因此不会保存RAM,只能保存磁盘空间。