C++ int t[1000000]={1,2,3};产生一个大的二进制文件,为什么?
此代码(作为.cpp文件)在使用g++编译时生成一个小的二进制文件。如果我以后使用数组t,它的所有元素都将设置为0C++ int t[1000000]={1,2,3};产生一个大的二进制文件,为什么?,c++,g++,C++,G++,此代码(作为.cpp文件)在使用g++编译时生成一个小的二进制文件。如果我以后使用数组t,它的所有元素都将设置为0 int t[1000000]; int main(){} 这一个,即使使用大小优化(-Os)编译,也会生成一个近4M大的二进制文件。阵列t与第一示例中的相同,只是t[0]、t[1]和t[2]分别设置为1、2和3。为什么存储这三个数字需要这么多额外的文件大小? 在linux上测试,gcc 5.4.0版具有静态存储持续时间的零初始化数据通常非常高效地存储在可执行文件中。它几乎不占用磁
int t[1000000];
int main(){}
这一个,即使使用大小优化(-Os)编译,也会生成一个近4M大的二进制文件。阵列t与第一示例中的相同,只是t[0]、t[1]和t[2]分别设置为1、2和3。为什么存储这三个数字需要这么多额外的文件大小?在linux上测试,gcc 5.4.0版具有静态存储持续时间的零初始化数据通常非常高效地存储在可执行文件中。它几乎不占用磁盘空间。可执行文件包含两个字,表示它需要多少零初始化字节以及在哪个地址,就是这样 另一方面,静态初始化的数据存储为表示其值的文本字节,而这些字节中的大多数是否为零并不重要。可执行文件格式的定义使其需要物理存储所有文件。没有规定以节省空间的方式指定“1、2、3,其余为零”
当可执行文件加载到RAM中时,加载器为零初始化数据分配所需的内存量,并用零值字节填充,因此不会节省RAM,只会节省磁盘空间。在第一个示例中,
t
可能存储在.bss
段中,而在第二个示例中,t
可能存储在.data
段中。参见和intt[1000000]={1,2,3}代码>将初始化值。你得到1,2,3,然后是99997个零。这必须去某个地方,而且听起来整个durn的东西,零和所有,都被存储了。
int t[1000000]={1,2,3};
int main(){}