3

可能重复:
为什么编译的 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 KB)。使用此算法,段的最小大小为 4 KB,然后以 4 KB 为增量调整大小。

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

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

4

4 回答 4

5

这是你测量什么的问题。如果它是原始可执行文件大小,那么除了main().

当我们在这里使用共享动态库时,很大一部分的大小将由管理数据(如符号表、全局偏移表和要链接的共享库的描述)来解释 - 的代码共享库本身不在二进制文件中。

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

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

于 2012-08-05T09:08:19.457 回答
2

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

一个较小的 hello world 是使用 bash 脚本(也需要另一个程序来运行)

echo Hello World

总共 17 个字节,换行。

于 2012-08-05T08:53:39.650 回答
1

一个因素是

#include <iostream>

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

于 2012-08-05T08:45:42.683 回答
1

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

于 2012-08-05T08:35:50.167 回答