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

Why is a C/C++ "Hello World" in the kilobytes?

本文关键字:千字节 为单位 World Hello C++ 为什么      更新时间:2023-10-16

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

只是出于好奇,我刚刚用C,C++和Java编译了"Hello Worlds"。

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

然而,C和C++是8.5K和9.2K。

为什么它们这么大?我一直假设 stdio 或 iostream 是动态链接的,并且不会增加可执行文件的大小。

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


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

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

这是一个你正在测量的问题。 如果是原始可执行文件大小,则除了用于main()的代码之外,它还包含很多内容。

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

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

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

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

一个较小的hello世界是使用bash脚本(也需要另一个程序才能运行)

echo Hello World

总共 17 个字节,带有一个新行。

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

一个因素是

#include <iostream>

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