【发布时间】:2021-02-18 13:14:06
【问题描述】:
我用 C 语言创建了一个简单的 hello world 程序,如下所示:
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
之后,我在 Mac 上使用 gcc 编译它并使用 xxd 转储它。每行 16 个字节(8 个字),编译后的程序总共有 3073 行或 49424 个字节。在所有这些字节中,只有 1 904 个字节组成了程序,而其余 47 520 个字节全为零。
考虑到只有大约 3.9% 的字节不是零,这是一个明显的空间浪费示例。有没有办法在这里优化可执行文件的大小? (顺便说一句,我已经尝试过使用-Os 编译器选项,但没有得到任何结果。)
编辑:我通过计算 hexdump 的行数得到了这些数字,但在包含实际指令的行中也有零。我没有计算这些字节,因为它们可能对程序的执行至关重要。 (就像字符串 Hello World! 的空终止符)我只计算了完整的零块。
【问题讨论】:
-
@Gerhardh 抱歉,我的意思是每行 16 个字节。 8个字。文件的大小也与 49 424 字节相匹配。
-
只有
#include <stdio.h>怎么样? -
可执行文件具有依赖于系统的固定结构。不确定 Mac 上的 gcc,但由于底层系统是 Darwin,它是 BSD 的衍生产品,我会假设 elf。众所周知,elf 格式会生成大文件。但我记得 MS/DOS 系统上的 .com 文件要简洁得多:一个 256 字节的标头,后面是原始机器代码。可执行文件的较大部分是标准库,但使用汇编时,Hello world 程序的长度可能不到 300 字节...
-
这么多臃肿,这么少时间......
-
muppetlabs.com/~breadbox/software/tiny/teensy.html 逐步构建一个 45 字节的可执行文件。