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

可能重复:
为什么编译的Java类文件小于C编译文件?

出于好奇,我刚刚在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

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

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

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

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

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

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

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

 echo Hello World 

总共17个字节,换行。

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

一个因素是

 #include  

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