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

int类型指针是否存在开销?无修改需求时传指针有必要吗?

函数参数传递:值 vs 指针的开销与适用场景

问题

如果我有个函数foo,它接收参数n且不会修改这个参数,那用指针形式传递这个参数会不会有开销?另外,像下面这种使用场景里,有没有必要用指针?

extern volatile int bar;

void foo(int n){
    bar = n;
}
void foo2(int *n){
    bar = *n;
}

一、指针传递的开销

对int这种基础数据类型来说,用指针传递肯定会多出来一些开销:

  • 值传递的时候,直接把int的值(一般是4字节)压栈或者用寄存器传递,操作起来简单又直接。
  • 指针传递的话,要传的是内存地址(32位平台4字节,64位8字节),而且函数内部还得多做一次解引用操作——也就是去读指针指向的内存里的值,这多了一次内存访问的步骤,如果这块内存不在缓存里,开销会更明显。

二、当前场景下用指针的理由?

在你给的这个代码场景里,几乎找不到合理的理由用指针传递:

  1. 函数不需要修改参数:既然foo和foo2都只是把参数的值赋给bar,不需要改动原变量,值传递完全够用,反而效率更高。
  2. 避免不必要的风险:指针传递会让函数依赖外部内存的有效性,如果传个空指针进来,foo2直接就会触发未定义行为;值传递就没这个问题。
  3. 代码可读性更差:指针传递在这里没有语义上的优势(比如用来表示“输出参数”或者传递大对象),只会让人误解——别人看到指针参数,第一反应会觉得函数要修改这个值,反而增加理解成本。

唯一极端小众的情况可能是:如果n的值会被其他线程频繁修改,你需要确保bar拿到的是n的最新值?但实际上bar已经是volatile的,值传递时参数n是原变量的副本,指针传递时解引用会直接读原变量——但这种场景属于非常特殊的需求,通常也该用同步机制处理,根本不是用指针传递的合理理由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:34:59