为什么C / C ++中的“Hello World”是千字节?

时间:2012-08-05 08:32:03

标签: java c++ c executable

  

可能重复:
  Why are compiled Java class files smaller than C compiled files?

出于好奇,我刚刚用C,C ++和Java编译了“Hello Worlds”。

由于运行时不包含在二进制文件中,因此我理解Java类文件只有423B非常精简。

然而,C和C ++是8.5K和9.2K。

他们为什么这么大? 我一直认为stdio或iostream是动态链接的,不会增加可执行文件的大小。

那么所有的千字节来自哪里? 通过查看hexdump,我发现有很多填充,我想是出于性能原因。为什么二进制格式确实如此组织?


pmg的链接非常有帮助!

关于填充,我发现它是将程序段与虚拟内存页边界(4096字节)对齐,导致它至少为8192字节。

关于mach-o二进制格式(适用于OS X和iOS)

  

为获得最佳性能,应在虚拟内存页面边界上对齐段 - 对于PowerPC和x86处理器,为4096字节。要计算段的大小,请将每个段的大小相加,然后将总和向上舍入到下一个虚拟内存页边界(4096字节或4千字节)。使用此算法,段的最小大小为4千字节,此后它的大小为4千字节增量。

引用http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html

我会在下次询问之前做研究;)

4 个答案:

答案 0 :(得分:4)

这是您正在测量的问题。如果它是原始可执行文件大小,除了main()的代码之外,它还包含很多内容。

由于我们在这里使用共享动态库,大量的大小将通过管理数据来解释,例如符号表,全局偏移表以及要链接的共享库的描述 - 共享库本身的代码不在二进制文件中。

iostream库相当大,并且还具有静态初始化程序 - 例如初始化coutcerrcin对象。这是目标文件必须包含的另一件事。

实际上,当应用程序运行时,大多数额外大小都不是驻留内存。

答案 1 :(得分:2)

C& C ++是一个完整的独立程序。 Java只是核心代码,需要另一个程序来运行它。

较小的hello世界是使用bash脚本(还需要运行其他程序)

echo Hello World

总共17个字节,换行。

答案 2 :(得分:1)

因为包含了stdlib。尝试使用-nostdlib

答案 3 :(得分:1)

一个因素是

#include <iostream>

导致许多标准库与您的程序链接。但是没必要担心。它只是一个初始开销,它不会随着程序的复杂性或代码的长度而增加。无论如何,请尝试使用UPX