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

按引用传递的空间复杂度是多少?相关内存分配场景解析

按值传递 vs 按引用传递的空间开销差异

嘿,刚好之前啃空间复杂度的时候也琢磨过这个点,来给你唠明白:

  • 按值传递的内存开销
    在采用按值传递的语言里,每次把变量作为参数传给函数时,都会给函数的局部变量分配一块全新的内存,然后把原变量的完整值复制进去。举个例子:如果传的是个int类型变量,那就是新开辟4字节(32位系统下)存这个副本;要是传的是个几十KB的大结构体,那整个结构体的内容都会被复制,空间开销一下就上去了,对空间复杂度的影响也很直接。

用伪代码直观感受下:

function increment(num) {
  num += 1;
  return num;
}
let count = 10;
increment(count); // 这里count的值被完整复制到函数内的num变量里,两者各占独立内存
  • 按引用(指针)传递的空间优势
    换成传递指针(也就是按引用传递)的话,就完全不一样了。这时候函数的局部变量根本不是存原变量的内容,而是存原变量在内存里的地址。这个地址的大小是固定的——32位系统是4字节,64位是8字节,不管原变量是个小数字还是几百MB的数组,开销就这么点。因为我们根本没创建原变量的副本,只是给函数指了个路,让它能直接找到原变量的内存位置去操作。

同样用伪代码举例:

function increment(numPtr) {
  *numPtr += 1; // 通过地址直接操作原变量的值
  return *numPtr;
}
let count = 10;
increment(&count); // 传的是count的内存地址,numPtr只存这个地址

这里没有为原变量的内容分配新空间,只是多了个存地址的小变量,空间开销可以忽略不计,处理大对象时对空间复杂度的优化特别明显。

顺带提一句:有些语言里的“引用传递”可能是语法糖包装后的指针,但核心逻辑都是一致的——传递的是指向原变量的地址,而非值的副本,所以不会额外占用存储原变量内容的空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:22:29