只是出于好奇,我刚刚用 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 为增量调整大小。
下次问之前我会做研究;)