You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何局部变量初始化指令对可执行文件大小影响远小于全局变量?

可执行镜像与变量存储的底层问题

全局变量位于可执行镜像中,因此使用全局变量会增加可执行镜像的大小。

用户问题

  1. 「位于可执行镜像中」是什么意思?据我了解全局变量位于可执行文件的data段,我推测局部变量初始化指令存储在text段。那为何局部变量初始化指令占用的空间与全局变量相差甚远?
  2. 此处的“可执行文件”指加载到内存中的还是仅存储在非易失性存储器中的?未加载到RAM的可执行文件中,全局变量也会占用更多空间吗?
  3. 有哪些书籍或简洁的阅读资源可以帮助我理解这类底层概念?

用户补充的示例代码与疑惑:

#include <stdlib.h>

int global_var = 10;

int main(void){

    int local_var = 20;
    return EXIT_SUCCESS;
}

原本认为局部变量初始化指令在可执行文件中占用的空间应与全局变量相当,疑惑为何global_var会占用更多空间?


问题解答

问题1解答

「位于可执行镜像中」指的是全局变量的初始值会被直接存储在可执行文件的特定数据段(比如data段)里,编译链接完成后,这些值就固定在可执行文件中了。

你提到的局部变量初始化,本质是在程序运行时通过指令完成的:比如示例里的int local_var=20,对应的机器码是把数值20写入栈上的局部变量位置,这条指令可能只占5-6个字节(x86架构下)。单看这个小变量例子,两者空间差异不大,但如果是大体积变量,比如int global_arr[1000] = {1,2,3,...},data段会直接占用4000字节存储所有初始值;而如果是局部数组做同样初始化,编译器大概率会生成循环赋值或者调用memset的指令,这些指令总长度可能只有几十字节,和4000字节的差距就非常明显了。资料里说的“占用空间相差甚远”,主要针对这类大变量场景。

问题2解答

这里的“可执行文件”同时包含两种状态:

  • 存储在磁盘、Flash等非易失性存储器里的静态可执行文件;
  • 加载到RAM中运行的进程镜像(内存里的可执行实例)。

未加载到RAM的静态可执行文件里,全局变量同样会占用空间:比如示例中,磁盘上的可执行文件的data段已经有4字节用来存10这个值,而局部变量的初始化只是text段里的几条指令。所以不管有没有加载,全局变量只要有非零初始值,就会在可执行镜像里占用对应数据大小的空间,大变量情况下确实比局部变量的初始化指令占更多空间。

问题3解答

推荐几个适合入门底层概念的资源:

  • 《深入理解计算机系统》(CSAPP):底层知识的经典教材,覆盖编译、链接、内存管理、指令集等核心内容,示例贴近实际开发;
  • 《程序员的自我修养——链接、装载与库》:专门聚焦链接、装载机制,对理解可执行文件结构、变量存储细节帮助很大;
  • 《x86汇编语言:从实模式到保护模式》:如果想深入指令集和内存布局,这本书能帮你建立直观的底层认知;
  • GCC、GNU ld官方手册:可以直接查到编译链接过程中变量处理的具体规则,适合针对性查阅。

内容的提问来源于stack exchange,提问作者Quorthon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:00:19