You need to enable JavaScript to run this app. C++中函数值返回与通过引用传参返回哪种实现效率更高
优惠活动
大模型
产品
解决方案
定价
更多

C++中函数值返回与通过引用传参返回哪种实现效率更高

结论先行

在你给出的实际调用场景下,两种写法的执行效率没有任何可感知的差异,“传引用填充一定比返回值快”是脱离现代C++编译优化的过时经验。

逐段拆解实际运行逻辑

返回值版本到底有没有拷贝开销

第一个直接返回vector的实现,完全不需要担心所谓“返回大对象拷贝”的问题:

  • 从C++17开始,对函数内定义的局部自动对象做NRVO(命名返回值优化)是标准的硬约束:编译器会直接在调用方接收返回值的内存位置(也就是main里arr的存储地址)构造函数内部的result变量,全程根本不会产生vector的拷贝、甚至移动构造的额外开销。
  • 就算是更早的C++11/14标准,GCC、Clang、MSVC在默认O2优化等级下,也会对这种逻辑直白、没有复杂分支跳转的vector返回场景做完整的NRVO优化,连半次额外的对象传递开销都不会有。
  • 真遇到极端的控制流(比如函数里根据不同条件返回不同的局部对象)导致NRVO失效,也没关系——C++11之后返回局部vector时会自动触发移动构造,移动一个vector的开销就是拷贝三个指针大小的成员,和函数本身填充10000个字符串的工作量比,连零头都算不上。

引用填充版本的实际开销

第二个靠引用传入vector再填充的实现,在你写的调用场景里的流程是:

  • 在main里先造一个空的arrPassingByRef,把它的引用传给函数,循环往这个空vector里塞10000个字符串。
  • 从空vector开始动态扩容、逐个填充字符串的整套逻辑,和返回值版本里result的构造填充过程完全一致,没有任何性能上的区别。
  • 唯一的区别是写法的形式差异:引用版本需要调用方提前手动声明一个空vector,这部分变量初始化的开销和返回值优化下直接在调用方内存构造对象的开销完全等价。

几个容易踩的认知误区

  • 引用版本只有在传入的vector本身不是空状态的时候,才会和返回值版本产生语义偏差:这时候它会在已有元素后面追加新内容,而不是生成一个完全全新的填充vector——这种场景下已经不是“相同功能换写法”的对比前提了。
  • 这种手写引用填充的写法根本不存在性能优势,反而有不少实际使用的问题:
    • 代码更啰嗦,调用方必须提前声明变量,没法直接把返回结果嵌到其他表达式里用
    • 容易出bug:万一忘记传空vector,会把原有业务数据意外追加进去造成污染
    • 灵活性更差,没法直接利用临时对象的移动语义,比如要把结果直接当参数传给其他函数时,写起来更绕

额外提一句:不管用哪种写法,想真的提升这个函数的性能,最实在的优化是在循环之前调用result.reserve(10000)提前把内存分配够,避免填充过程中vector反复扩容、搬移已有元素的开销。这部分优化带来的提升,比纠结两种写法的差异大得多。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 03:36:10