我从一个“空”程序开始,检查了生成的.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文件的大小?
答案 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"
这对计算机非常简单。尝试创建许多功能和对象,然后,您可能会开始发现不同。