先看几个实例
代码1
#include <iostream>
int data_arr[32768];
int main()
{
data_arr[1] += 11;
std::cout<<"data_arr[1]: " << data_arr[1] << std::endl;
return data_arr[1];
}
上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为15KB左右。
代码2
#include <iostream>
int data_arr[32768] = {0,0,0,0,0};
int main()
{
data_arr[1] += 11;
std::cout<<"data_arr[1]: " << data_arr[1] << std::endl;
return data_arr[1];
}
上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为15KB左右。
代码3
#include <iostream>
int data_arr[32768] = {2};
int main()
{
data_arr[1] += 11;
std::cout<<"data_arr[1]: " << data_arr[1] << std::endl;
return data_arr[1];
}
上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为143KB左右。
代码4
#include <iostream>
int data_arr[32768] = {1,2,3,4,5,6};
int main()
{
data_arr[1] += 11;
std::cout<<"data_arr[1]: " << data_arr[1] << std::endl;
return data_arr[1];
}
上述代码在Win10 X64,MSVC Release模式下编译,编译得到的二进制文件大小为143KB左右。
情况分析
为何前两份代码和后两份代码编译之后的二进制文件大小会差异这么大?
原因就是全局变量data_arr 定义的方式不同。前两份代码中data_arr变量定义但是没有初始化或初始化为0,此变量运行时实际会存放在bss段(Block Started by Symbol Segment)中,只存符号(只有占位符),没有初始化的具体的值,自然也就不需要在二进制文件中保存这些值,因此文件很小。