为啥以千字节为单位的 C/C++“Hello World”? [复制]
Posted
技术标签:
【中文标题】为啥以千字节为单位的 C/C++“Hello World”? [复制]【英文标题】:Why is a C/C++ "Hello World" in the kilobytes? [duplicate]为什么以千字节为单位的 C/C++“Hello World”? [复制] 【发布时间】:2012-08-05 08:32:02 【问题描述】:可能重复: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 KB)。使用此算法,段的最小大小为 4 KB,此后以 4 KB 为增量调整大小。
引用http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html
我会在下次问之前做研究;)
【问题讨论】:
您可能想阅读A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux。 @pmg - 感谢您提供该链接。这是一部了不起的作品,写得很好。 这让我想起了演示场景,其中一个 64 kB 的程序可以打开一个带有按钮和复选框的窗口进行设置,然后播放一个惊人的 3D 视频,完整的声音,超过 5 分钟,甚至如果存储为图像文件,即使经过合理压缩,该视频的一帧也会超过 64 kB。 【参考方案1】:这是一个关于你测量什么的问题。如果是原始可执行文件大小,那么除了main()
的代码之外,它还包含很多内容。
当我们在这里使用共享动态库时,很大一部分大小将由管理数据(如符号表、全局偏移表和要链接的共享库的描述)来解释 -共享库本身的代码不在二进制文件中。
iostream 库是一个相当大的库,并且还有静态初始化器——例如初始化cout
、cerr
和cin
对象。这是目标文件必须包含的另一件事。
实际上,大部分额外大小在应用程序运行时并不驻留在内存中。
【讨论】:
【参考方案2】:C & C++ 是一个完整的独立程序。 Java 只是核心代码,需要另一个程序来运行。
一个较小的 hello world 是使用 bash 脚本(也需要另一个程序来运行)
echo Hello World
总共 17 个字节,换行。
【讨论】:
是和不是。 C 和 C++ 包含可执行代码,但它仍然依赖于很多管道:操作系统必须解析 ELF 文件,并且系统上仍然必须存在单独的库(stdlib)。但你是对的,它不依赖单独的解释器/编译器将文件转换为可执行代码【参考方案3】:因为包含了标准库。尝试使用 -nostdlib
【讨论】:
如果没有 C 标准库,hello world 程序要么无法链接,要么需要使用原始系统调用进行一些 IO。会产生一个非常小的二进制文件!【参考方案4】:一个因素是
#include <iostream>
这会导致很多标准库与您的程序链接。但是,无需担心。这只是一个初始开销,它不会随着程序的复杂性或代码的长度而增加。无论如何,请尝试使用UPX。
【讨论】:
以上是关于为啥以千字节为单位的 C/C++“Hello World”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章