实际上,如果您的代码什么都不做,编译器仍然创建可执行文件是否公平?;-)
好吧,在 Windows 上,任何可执行文件仍然有大小,尽管它可能很小。使用旧的 MS-DOS 系统,一个完整的无操作应用程序只需几个字节。(我认为使用 21h 中断关闭程序需要四个字节。)然后,这些应用程序被直接加载到内存中。当 EXE 格式变得更流行时,情况发生了一些变化。现在可执行文件有关于进程本身的附加信息,例如代码和数据段的重定位以及一些校验和和版本信息。Windows 的引入为格式添加了另一个标题,告诉 MS-DOS 它无法执行可执行文件,因为它需要在 Windows 下运行。Windows 可以毫无问题地识别它。当然,可执行格式也扩展了资源信息,比如位图,
现在,无操作可执行文件的大小在 4 到 8 KB 之间,具体取决于您的编译器以及您用来减小其大小的每种方法。它的大小可以使 UPX 实际上产生更大的可执行文件!由于您在代码中添加了某些库,因此可能会在可执行文件中添加额外的字节。尤其是具有初始化数据或资源的库会增加大量字节。添加调试信息也会增加可执行文件的大小。
但是,尽管这一切都可以很好地减少大小,但您可能想知道继续担心应用程序的臃肿是否可行。现代硬盘会将文件分成几段,对于非常大的磁盘,差异会非常小。但是,保持尽可能小的尺寸所带来的麻烦会降低开发速度,除非您是熟悉这些优化的专家级开发人员。这些类型的优化不会提高性能,考虑到大多数系统的平均磁盘空间,我不明白为什么它是实用的。(不过,我确实以类似的方式优化了我自己的代码,但我对这些优化很有经验。)
对
EXE 标头感兴趣?它以字母 MZ 开头,代表“Mark Zbikowski”。第一部分是用于可执行文件的老式 MS-DOS 标头,用作 MS-DOS 的存根,表示该程序
不是MS-DOS 可执行文件。(在二进制文件中,您可以找到文本“此程序无法在 DOS 模式下运行。”这基本上就是它所做的一切:显示该消息。接下来是 PE 标头,Windows 将识别并使用它而不是 MS-DOS标头。它以字母
PE 开头,表示 Portable Executable. 在第二个标头之后将是可执行文件本身,分为几个代码和数据块。标头包含特殊的重新分配表,它告诉操作系统在哪里加载特定的块。如果你能把它控制在一个限度内,最终的可执行文件可以小于 4 KB,但 90% 将是标题信息,没有任何功能。