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

C和Go为何约定传递指针修改变量而非返回新变量,二者有何性能差异?

两种编码模式的性能与使用限制对比

C和Go默认都是值传递语义,参数、返回值都会默认做内存拷贝,这是两种模式并存的核心前提,两者的优劣场景差异非常明确:

直接返回值模式

性能优势

  • 小尺寸值(比如示例中的int、单基础类型、小于16字节的小结构体)场景下性能最优:这类值会被编译器优化到寄存器中传递,不需要额外内存寻址,也没有指针相关的额外开销。Go场景下还不会触发变量逃逸到堆,不会增加GC压力。
  • 没有多余的初始化步骤:不需要提前声明变量再传地址,直接接收返回值赋值即可,代码更简洁。

使用限制

  • 大尺寸对象场景下开销陡增:如果返回的是几百字节以上的结构体、数组,全量内存拷贝的开销会远大于指针传递,C场景下栈拷贝开销很高,Go场景下甚至可能触发栈扩容,进一步拖慢性能。
  • C语言原生不支持多返回值,如果需要同时返回多个结果,用返回值模式实现非常麻烦。
  • 无法修改调用方已存在的变量的局部字段:如果只需要改已有对象的某一个属性,返回值模式只能替换整个对象,开销更高。

指针传参修改模式

性能优势

  • 大尺寸对象场景下性能提升显著:64位系统下指针只有8字节,不管指向的对象多大,传参都只需要拷贝这8字节,完全避免了大对象的全量拷贝开销。
  • 支持局部修改:不需要操作完整对象,只修改需要变更的字段即可,进一步降低计算开销。
  • C语言下可以同时返回状态码和修改结果:比如标准库的scanf、fread等函数都是这个模式,返回执行成功/失败状态的同时修改传入的变量,是非常通用的实现方案。

使用限制

  • 小对象场景下性能反而更差:需要额外做内存寻址,Go场景下大概率会触发变量逃逸到堆,增加GC负担,反而不如寄存器传返回值快。
  • 内存安全风险更高:C语言下传入空指针、野指针会直接触发段错误,Go语言下传入空指针也会触发panic,需要额外做参数校验。
  • 可读性差:调用方无法直接从函数签名区分输入参数和输出参数,维护成本比返回值模式高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:01