可能重复:
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千字节增量。
我会在下次询问之前做研究;)
答案 0 :(得分:4)
这是您正在测量的问题。如果它是原始可执行文件大小,除了main()
的代码之外,它还包含很多内容。
由于我们在这里使用共享动态库,大量的大小将通过管理数据来解释,例如符号表,全局偏移表以及要链接的共享库的描述 - 共享库本身的代码不在二进制文件中。
iostream库相当大,并且还具有静态初始化程序 - 例如初始化cout
,cerr
和cin
对象。这是目标文件必须包含的另一件事。
实际上,当应用程序运行时,大多数额外大小都不是驻留内存。
答案 1 :(得分:2)
C& C ++是一个完整的独立程序。 Java只是核心代码,需要另一个程序来运行它。
较小的hello世界是使用bash脚本(还需要运行其他程序)
echo Hello World
总共17个字节,换行。
答案 2 :(得分:1)
因为包含了stdlib。尝试使用-nostdlib
答案 3 :(得分:1)