c - 未初始化的全局变量对可执行文件大小的影响
问题描述
一个高度投票的先前答案的高度投票评论指出:
考虑有许多长度为 4096 字节的未初始化缓冲区。您是否希望所有这些 4k 缓冲区都有助于增加二进制文件的大小?那会浪费很多空间。
我正在将以下两个文件构建到 ubuntu 上的可执行文件中:
主程序
int sum(int *a, int n);
int array[2] = {1,2};
int abc;//Comment in case (a) Uncomment in case (b) and (c)
int def;//Comment in case (a) and (b) Uncomment in case (c)
int main(){
int val = sum(array, 2);
return val;
}
总和.c
int sum(int *a, int n){
int i, s = 0;
for(i = 0; i < n; i++)
s += a[i];
return s;
}
以下命令用于创建可执行文件
$gcc -Og -o prog main.c sum.c
有3种情况:
(a) 没有未初始化的全局变量。可执行文件的大小为 8648 字节。
(b) 具有未初始化的全局变量abc
。可执行文件的大小为 8680 字节。
(c) 具有未初始化的全局变量abc
和def
. 可执行文件的大小为 8704。
我的问题是,为什么可执行文件大小甚至会改变?我的理解(也由上面链接的答案证实)是未初始化的全局变量不应该影响可执行文件的大小。
解决方案
推荐阅读
- java - Android工作室:不工作JsonArrayRequest
- pyqt - pyqt5 按钮单击在我的第二个窗口中不起作用
- swift - 单击按钮时 UITextField 更改宽度
- python - 使用 Python 抓取与 Google 趋势 API
- javascript - 使用数组中的按钮传递值
- unity3d - ShaderLab Unity:使用 Surface Shader 将顶点渲染到 UV 空间
- python - 根据其他两个数组的前后元素的差异创建新数组
- ethereum - 为什么这些以太坊合约没有席卷 USDT?
- python - 当类错误具有不同权重时用于多类分类的自定义指标
- gstreamer - GStreamer 中的 0(零)帧率是什么意思?