c - 为什么简单的程序会占用这么多存储空间?
问题描述
我在 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!
)我只计算了完整的零块。
解决方案
生成的文件不仅包含程序所需的代码和数据。它还包含正确加载和执行程序所需的元数据。一般来说,这个元数据可能会被分成多个部分,每个部分都需要在某个边界对齐。为了做到这一点,可以添加一些零来填充。对更大的程序进行相同的检查将减少元数据和填充占用的空间。
推荐阅读
- html - 嵌套 id 的 CSS 不会被覆盖
- c# - 从 Xml 响应中获取特定元素值 (RestSharp/C#)
- javascript - 为什么我的两种方法在调用 onClick 时都不起作用?
- c++ - 将鼠标光标移动到 Raspbian、OpenCV 中的某个位置
- distance - 为什么测量到一定距离后我的 LED 不亮?Atmega328p 和超声波 HC-SR04 传感器
- wso2 - WSO2 身份服务器 - 根据用户角色限制服务提供商的入站身份验证
- react-native - React Native如何计算文本的字符长度?
- java - 将 int 转换为双 java
- amazon-web-services - Lambda@edge 记录发布请求 ID 但不发布控制台日志
- react-native - @react-native-community/picker 抛出注册两个同名视图的错误