首页 > 解决方案 > 为什么添加更多变量和/或指令后程序大小保持不变?

问题描述

我从一个“空”程序开始,检查了生成的 .exe 文件的大小

int main()
{
    system("pause");
}

Exe 大小:58.5 KB(59,904 字节)

然后我添加了大量的静态变量

int main()
{
    const int BIG_NUMBER = 40000000;
    static int x[40000000];

    system("pause");
}

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");
}

Exe 大小:58.5 KB(59,904 字节)

从字面上看,不是一个字节。在这一点上,我(在黑暗中刺伤)的猜测是 .exe 请求操作系统在程序启动时为静态变量分配正确的内存量,但这似乎不正确。什么决定了 .exe 文件的大小?

标签: c++memorycompilationstatic

解决方案


我编译了有和没有大数组的程序,转储了两个节标题并进行了比较。这是唯一的区别:

     Idx Name          Size      VMA               LMA           File off  Algn
- 23 .bss          09896820  0000000000004020  0000000000004020  00003010  2**5
+ 23 .bss          00000008  0000000000004010  0000000000004010  00003010  2**0

正如您所怀疑的,两者之间的唯一大小差异是可执行文件从 OS 请求的内存块的大小。可能会有额外的一两个字节的代码,但无论如何代码很可能会四舍五入到最近的页面。

正如链接页面所述:

通常只有 bss 部分的长度,而不是数据,存储在目标文件中。程序加载器在加载程序时为 bss 部分分配内存。


推荐阅读