为什么 C/C++“Hello World”以千字节为单位?

Pha*_*ast 3 c c++ java executable

\n

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

\n
\n\n\n\n

出于好奇,我刚刚用 C、C++ 和 Java 编译了“Hello Worlds”。

\n\n

Java 类文件非常精简,只有 423B,据我所知,因为运行时不包含在二进制文件中。

\n\n

然而,C 和 C++ 的大小是 8.5K 和 9.2K。

\n\n

为什么它们相对较大?\n我总是假设 stdio 或 iostream 是动态链接的,并且不会增加可执行文件的大小。

\n\n

那么所有千字节从何而来?\n通过查看十六进制转储,我发现有很多填充,我猜是出于性能原因。为什么二进制格式是这样组织的?

\n\n
\n\n

pmg的链接非常有帮助!

\n\n

关于填充,我发现程序段与虚拟内存页面边界(4096 字节)的对齐导致它至少为 8192 字节。

\n\n

关于 mach-o 二进制格式(适用于 OS X 和 iOS)

\n\n
\n

为了获得最佳性能,对于 PowerPC 和 x86 处理器,段应在虚拟内存页边界 \xe2\x80\x944096 字节上对齐。要计算段的大小,请将每个段的大小相加,然后将总和向上舍入到下一个虚拟内存页边界(4096 字节或 4 KB)。使用此算法,段的最小大小为 4 KB,此后以 4 KB 增量调整大小。

\n
\n\n

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

\n\n

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

\n

mar*_*rko 5

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

由于我们在这里使用共享动态库,因此很大一部分大小将由内部数据占用,例如符号表、全局偏移表和要链接的共享库的描述 - 代码共享库本身并不在二进制文件中。

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

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