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

C++ 当添加更多变量和/或指令时,为什么程序大小保持不变?,c++,memory,compilation,static,C++,Memory,Compilation,Static,我从一个空程序开始,检查生成的.exe文件的大小 int main() { system("pause"); } Exe大小:58.5 KB 59904字节 然后我添加了大量静态变量 int main() { const int BIG_NUMBER = 40000000; static int x[40000000]; system("pause"); } Exe大小:58.5 KB 59904字节 使数组非静态也没有效果。我在a中添加了一些代码,以100

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

int main()
{
    system("pause");
}
Exe大小:58.5 KB 59904字节

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

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

    system("pause");
}
Exe大小:58.5 KB 59904字节

使数组非静态也没有效果。我在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 59904字节


从字面上看,没有一个字节更多。在这一点上,我的猜测是,当程序启动时,.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
正如您所怀疑的,两者之间唯一的尺寸差异是。可能有一个或两个额外的字节的代码,但很可能代码被舍入到最近的页面

如链接页面所述:

通常,对象文件中只存储bss节的长度,而不存储数据。程序加载器在加载程序时为bss节分配内存

什么决定了.exe文件的大小

这实际上取决于你在做什么。但到目前为止,最值得注意的是您包含的库

使数组非静态也没有效果。我在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");
}
你启用调试模式了吗?或者你正在使用释放模式?要小心,因为在发布模式下,他们会过度优化您的代码


这对计算机来说非常简单。尝试创建大量函数和对象,然后,您可能会开始看到不同

为什么操作系统会为程序的变量分配内存对你来说不合适?变量的存储实际上不在可执行文件中。。。例如,假设可执行文件位于只读硬盘上,或者如果它是两次启动的,您如何编译代码?如何确定文件大小?您正在查看磁盘上的大小吗?它可能会向上取整到一个集群大小。您确定没有意外地查看同一文件三次吗?可能其他示例未能编译或编译到另一个文件。@M.M主要是因为我注意到更复杂的程序往往有更大的.exe文件。也不太确定,但因为我不确定程序如何知道要分配多少内存,例如,如果我有两个函数,每个函数都有一个大的静态数组,并且在运行时我随机选择其中一个函数进行调用,那么其中一个静态数组将永远不会被实例化。@FrançoisAndrieux我在MSVC上以默认设置进行调试编译。你是对的,也许这就是问题所在。是的,我检查过.exe每次都被修改过。@JesperJuhl你是说,一般来说,对于更现实的例子,你希望.exe的大小会随着更多指令和变量的添加而增加,但这种增加不会是线性的,这取决于编译器可以进行什么样的优化?这是针对磁盘中的文件大小,但是如果在内存内存中,这是一个不同的故事谢谢,这似乎给了我所有的关键概念,我需要谷歌完全理解
allocate 4 bytes of memory at 0xRANDOM address for variable BIG_INT
allocate another 40000000 bytes of memory at 0xRANDOM+4bytes address for variable x
create variable i = 0
create goto address "loop"
output x[i]  // This is also a problem, because x = null!
increment into i by one
if i is less than BIG_INT then jump to "loop"