为什么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库相当大,并且还具有静态初始化程序 – 例如初始化cout
, cerr
和cin
对象。 这是目标文件必须包含的另一件事。
实际上,大多数额外大小在应用程序运行时不是驻留内存。
C&C ++是一个完整的独立程序。 Java只是核心代码,需要另一个程序来运行它。
一个较小的hello世界是使用bash脚本(还需要运行其他程序)
echo Hello World
总共17个字节,换行。
因为包含了stdlib。 尝试使用-nostdlib
一个因素是
#include
这导致许多标准库与您的程序链接。 但是,没必要担心。 它只是一个初始开销,它不会随着程序的复杂性或代码的长度而增加。 无论如何,请尝试使用UPX 。