为什么在添加更多变量和/或指令时程序大小保持不变?

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文件的大小?

Dav*_*rtz 6

我使用和不使用大型数组编译您的程序,转储两个部分标题并进行比较.这是唯一的区别:

     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部分分配内存.