c++ - 为什么添加更多变量和/或指令后程序大小保持不变?
问题描述
我从一个“空”程序开始,检查了生成的 .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 文件的大小?
解决方案
我编译了有和没有大数组的程序,转储了两个节标题并进行了比较。这是唯一的区别:
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 部分分配内存。
推荐阅读
- javascript - SpyOn 一个模拟的笑话模块没有正确地进行间谍活动
- javascript - Hawk auth 适用于 python 请求,但不适用于 JS Axios
- python - Python 从字符串创建一个模块并运行该模块
- wordpress - 下订单后添加用户和用户元数据 - Woocommerce
- matlab - Matlab中的图像改组逆误差
- sql - 根据当前 PK 计算删除规则操作中的新值
- javascript - 使用 trackBy 时更新子组件
- javascript - Javascript 显示alert() 之前和之后的样式
- matlab - 在 MATLAB 中使用 set(gca,'LineWidth', x) 创建一个新图形,而原始图像具有默认宽度
- java - Java程序打印字符串中的第一个非重复字符