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

时间:2018-11-22 21:13:38

标签: c++ memory compilation static

我从一个“空”程序开始,检查了生成的.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请求OS为静态变量分配所需的正确内存量,但这似乎不对。什么决定了.exe文件的大小?

2 个答案:

答案 0 :(得分: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

您怀疑,两者之间唯一的大小差异是block of memory that the executable requests from the OS的大小。可能会有一个或两个额外的代码字节,但无论如何,代码可能会四舍五入到最接近的页面。

链接页面指出:

  

通常,目标文件中仅存储bss节的长度,而没有数据。程序加载器在加载程序时会为bss节分配内存。

答案 1 :(得分:1)

  

.exe文件大小由什么决定?

这实际上取决于您实际上在做什么。但是到目前为止,最著名的是您包含在#include

中的库
  

使数组为非静态也无效。我添加了一些代码来(a)确保100%确保变量没有被优化,并且(b)看看额外的指令是否会增加.exe的字节数

您启用了调试模式吗?还是您正在使用发布模式?请注意,因为在发布模式下,它们会优化您的代码too much

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

上面的代码仅包含“简单”指令,因此文件大小不会增加。

哦,也是,请注意,尝试使用std::cin.get()代替system("PAUSE")

如果您从程序集的角度来看,您所做的所有代码就是这样:

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"

这对计算机非常简单。尝试创建许多功能和对象,然后,您可能会开始发现不同。