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

递归中全局变量为何比局部变量占用更多内存?附C语言代码示例

为什么递归里全局变量看起来比局部变量占用更多内存?

咱们先把这个问题的核心理清楚——其实这里有个很容易搞混的点,全局变量本身的内存占用并不会跟着递归次数变多,但你观察到的差异,本质是变量存储的内存区域不一样,结合你的两段C代码来拆解就明白了:

1. 先搞懂内存分区的本质差异

  • 全局变量:就像你版本1里的globalA和globalB,它们是存在**静态存储区(数据段)**的。这个区域的内存是程序一启动就分配好的,整个程序运行期间只存一份,不管递归调用几百次几千次,它们占用的内存都是固定的——两个int类型,也就8字节左右(看系统是32位还是64位)。
  • 局部变量:如果是main里的局部变量(版本2的情况),它们存在栈区;要是你在递归函数内部定义局部变量,那每次递归调用都会在栈上新建一份这个变量的实例,栈内存会跟着递归深度一路涨上去。

2. 你的两段代码的内存占用细节

版本1(全局变量)

你的递归函数拿的是全局变量的指针,每次递归调用时,栈上只会存俩东西:

  • 函数执行完要返回的地址
  • 那两个指针参数(a和b,64位系统里每个指针8字节,加起来16字节)

而且巧了,你的递归是尾递归——递归调用是函数最后一步操作,很多编译器会自动做尾递归优化,直接复用当前的栈帧,不会因为递归次数增加多耗栈内存。但静态存储区里的全局变量,会一直占着内存直到程序结束。

版本2(局部变量)

假设你版本2是把globalA和globalB改成main里的局部变量,再传指针给递归函数,那栈上的消耗和版本1几乎没差——还是只存返回地址和指针参数。但要是你在递归函数里定义了新的局部变量(比如每次递归都搞个新的int),那栈内存会跟着递归深度蹭蹭涨,但这时候栈的占用应该会比全局变量多啊?和你的问题刚好相反。

哦,可能你观察到的“全局变量占用更多”,是指整个程序的内存占用?因为全局变量从程序启动就一直占着内存,而栈上的局部变量是临时的,函数返回后就会被释放(比如main结束后局部变量就没了)。递归运行的时候,栈的占用是动态变化的,而全局变量是稳稳占着那点内存。

3. 容易踩的误解坑

你可能把“内存占用的时机”和“内存占用的总量”搞混了:

  • 全局变量是持续占用静态存储区的内存,从程序启动到结束;
  • 栈上的局部变量是临时占用,只有函数执行的时候存在,递归结束后栈帧就被回收了。

如果你的递归深度不大,栈的临时占用可能比静态存储区的全局变量小,所以看起来全局变量占用更多。但要是递归深度特别大,栈的总占用会远远超过全局变量那点固定内存。

总结一下

全局变量的内存占用是固定死的,不会随递归次数变化;局部变量的内存占用要看情况——如果是传的局部变量指针,栈占用和全局变量版本差不多;如果是递归函数内部的局部变量,栈占用会跟着递归深度涨。你看到的“全局变量占用更多”,大概率是因为全局变量一直占着内存,而栈上的局部变量是临时的,或者你的测试工具统计的是程序的总内存(包含静态存储区)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:12:35