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

函数中const引用参数与const参数的差异及效率疑问

关于const引用传参vs值传参的代码体积与效率问题

问题描述

我习惯在调用函数时使用const reference参数,认为这样能避免拷贝更高效。意外将函数参数从const reference改为const值后,发现编译后的代码体积有所减小。为验证该现象,我查看了最小示例代码(MWE)的汇编代码,发现void foo(const int& n)相比void foo(const int n)多了一条ldr r3, [r3]指令。想了解:

  1. 为何传引用时代码体积更大?
  2. 哪种传参方式更高效?

解答

一、传引用代码体积更大的原因

  • 引用的底层实现是指针:const int& n在编译阶段会被处理成指向int的指针。调用函数时,需要先传递变量的地址;函数内部还需要额外执行一次内存读取(就是你看到的ldr r3, [r3]),从指针指向的地址中取出实际值。而值传参const int n是直接把变量的值放到寄存器或栈中,函数内部可直接使用,无需额外的内存加载指令。
  • 额外的指令开销:传引用时,调用端要生成取地址的指令,函数内部要生成解引用的指令,这些额外指令会增加代码总指令数,导致编译后的代码体积变大。

二、哪种传参方式更高效?

需根据参数类型的大小分场景判断:

  • 小类型(如int、char、bool等基础类型):值传参更高效。小类型的拷贝成本极低(通常仅1-2条寄存器传递指令),而传引用带来的指针操作(取地址+解引用)会增加额外的内存访问开销,不仅代码体积更大,执行效率也可能更低——你看到的ldr指令就是额外的内存读取,相比直接用寄存器中的值,多了一次内存访问延迟。
  • 大类型(如大结构体、std::string、std::vector等):引用传参更高效。大类型的拷贝需要复制大量内存,成本极高(可能涉及多次内存读写甚至堆内存分配),而传引用仅需传递一个指针的大小(通常4或8字节),避免了大规模数据拷贝,此时无论是代码体积还是执行效率,引用传参都更具优势。
  • 编译器优化的影响:现代编译器(如GCC、Clang)会做诸多优化,比如省略拷贝、将引用直接优化为值传递(当编译器能确定引用指向的变量可直接复用时)。但这类优化依赖具体代码场景和编译选项,不能作为通用结论依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:45:42