为啥以千字节为单位的 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 库是一个相当大的库,并且还有静态初始化器——例如初始化coutcerrcin 对象。这是目标文件必须包含的另一件事。

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

【讨论】:

【参考方案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”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 性能监测命令

C和指针思想精髓

如何在 Ant 目标中使用文件大小

在 Rails 中将文件大小字符串转换为等效千字节

C语言中:char占1个字节,数值范围是-128到127. 我想问的是:char的数值范围为啥不是-128到128

如何找到最大堆栈大小?