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

Objective-C文件中const std::shared_ptr传参的优势解析

关于const std::shared_ptr<RProgram>作为函数参数的分析

直接给结论:这种传参方式没有性能优势,反而会产生不必要的拷贝开销,同时确实会临时共享program的所有权(直到函数执行结束)。

下面逐一对比三种传参模式的核心差异:


1. const std::shared_ptr<RProgram> program(你的疑问点)

这是「值传递 + shared_ptr本身不可修改」的组合:

  • 所有权:调用函数时会拷贝传入的shared_ptr,导致原对象的引用计数原子性+1;函数执行完毕后,拷贝的shared_ptr被销毁,引用计数原子性-1。换句话说,函数执行期间会和调用方共享对象所有权,只要函数没结束,对象就不会被销毁。
  • 权限限制:函数内部不能修改这个形参本身(比如不能让它指向另一个RProgram对象,也不能调用reset()),但如果RProgram本身是非const类型,仍然可以通过这个形参修改指向的对象内容。
  • 性能:因为要拷贝shared_ptr,而拷贝涉及线程安全的原子操作,所以存在一定性能开销,和第三种传参的性能完全一致,但比第二种引用传递的版本差。

2. const std::shared_ptr<RProgram>& program(仅引用传递)

这是「常量引用传递」:

  • 所有权:不会拷贝shared_ptr,引用计数完全不变,函数只是临时借用调用方的shared_ptr,不共享所有权。
  • 权限限制:函数内部不能修改这个引用指向的shared_ptr本身(比如赋值、reset操作),但如果RProgram是非const类型,仍然可以调用对象的非const成员函数来修改对象内容。
  • 性能:三种方式里性能最优,没有拷贝和原子操作的开销,适合函数只需要使用对象、不需要持有所有权的场景。

3. std::shared_ptr<RProgram> program(获取所有权)

这是「普通值传递」:

  • 所有权:同样会拷贝shared_ptr,引用计数原子性+1;但和第一种的区别是,函数内部可以自由修改这个形参(比如让它指向其他对象、调用reset()销毁拷贝),相当于把所有权的一部分转移到了函数中,函数可以自主决定这个拷贝的shared_ptr的生命周期。
  • 权限限制:函数内部既可以修改形参本身,也可以修改指向的对象(如果对象允许的话)。
  • 性能:和第一种const std::shared_ptr值传递的性能一致,都存在拷贝和原子操作的开销。

什么时候适合用const std::shared_ptr<RProgram>?

实际上这种用法极少有必要:

  • 如果不需要持有所有权,优先用const std::shared_ptr<RProgram>&,性能更好;
  • 如果需要持有所有权(比如要把shared_ptr存入容器、或者异步操作依赖它),用std::shared_ptr<RProgram>值传递更灵活,因为函数内部可以自由操作这个拷贝。

唯一可能的适用场景是:你需要强制函数内部不能修改形参本身,但又必须保证函数执行期间对象不会被销毁——但这种场景非常罕见,大部分时候都有更优的替代方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:20:34