Can*_*Yet 0 c++ memory static compilation
我开始使用"空"程序并检查生成的.exe文件的大小
int main()
{
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
exe大小:58.5 KB(59,904字节)
然后我添加了一大堆静态变量
int main()
{
const int BIG_NUMBER = 40000000;
static int x[40000000];
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
exe大小:58.5 KB(59,904字节)
使数组非静态也没有影响.我添加了一些代码(a)100%确定变量没有被优化掉(b)看看额外的指令是否会增加.exe的字节数
int main()
{
const int BIG_NUMBER = 40000000;
static int x[40000000];
for (int i = 0; i < BIG_NUMBER; ++i)
{
std::cout << x[i] << std::endl;
}
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
exe大小:58.5 KB(59,904字节)
字面上不是单个字节.在这一点上,我(在黑暗中刺)的猜测是.exe请求操作系统在程序启动时分配静态变量所需的正确内存量,但这似乎不对.什么决定了.exe文件的大小?
我使用和不使用大型数组编译您的程序,转储两个部分标题并进行比较.这是唯一的区别:
Idx Name Size VMA LMA File off Algn
- 23 .bss 09896820 0000000000004020 0000000000004020 00003010 2**5
+ 23 .bss 00000008 0000000000004010 0000000000004010 00003010 2**0
Run Code Online (Sandbox Code Playgroud)
如您所料,两者之间唯一的大小差异是可执行文件从OS请求的内存块的大小.可能有一个额外的字节或两个代码,但无论如何,代码可能会向上舍入到最近的页面.
如链接页面所述:
通常,只有bss部分的长度,但没有数据,存储在目标文件中.程序加载程序在加载程序时为bss部分分配内存.