c - 为什么简单的程序会占用这么多的存储空间?

标签 c compiler-construction

我用 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! 的空终止符)我只计算完整的零块。

最佳答案

生成的文件不仅仅包含您的程序所需的代码和数据。它还包含正确加载和执行程序所需的元数据。一般来说,这个元数据可能会被拆分成多个section,每个section需要在一定的边界对齐。为此,可能会添加一些零以进行填充。对较大的程序进行相同的检查将减少元数据和填充占用的空间。

关于c - 为什么简单的程序会占用这么多的存储空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66260709/

相关文章:

c - '=' 标记之前的预期构造函数、析构函数或类型转换

c - 十六进制值的有符号值计算逻辑

更改特定字符的颜色

将 `generic made up language X` 编译成可移植 C 的编译器

compiler-construction - Haskell 脱糖策略

assembly - 使用英特尔 SSE 执行分支的最佳方法是什么?

c - 加载库需要随机化内存地址是什么?

objective-c - 苹果操作系统 X : Intercept keyboard layout change

c++ - "-D__STDC_FORMAT_MACROS"gnu 编译器选项

c# - 为什么 'using' 提高了 C# 性能