传值最慢,尤其对大对象;传指针和传引用性能相近但语义与安全性差异大:传值必拷贝,传指针可为空且可重绑定,传引用(尤其const引用)安全、简洁、支持临时对象绑定。

传值最慢(尤其对大对象),传指针和传引用在机器码层面几乎没区别,但语义和安全性差异极大。
传值会触发拷贝构造,开销取决于对象大小
只要形参是 MyClass obj 这种写法,编译器就必须调用拷贝构造函数——哪怕你什么都没做。对 int、double 这类基本类型,拷贝就是一次寄存器赋值,快得可以忽略;但对含 1000 个 std::string 成员的类,拷贝就是上千次内存分配 + 字符串复制。
- 即使函数只读不改,传值也逃不掉拷贝
- 返回值优化(RVO/NRVO)只作用于返回值,不减免参数传值的拷贝
- 移动语义(
MyClass&&)可缓解,但需显式重载移动构造函数,且不适用于 const 对象
传指针和传引用生成的汇编指令基本一致
两者最终都只是把一个地址(8 字节)压栈或送入寄存器,没有对象内容搬运。性能上拉不开差距,真正影响决策的是使用意图和约束:
-
void f(int* p):允许传nullptr,函数内必须加if (p == nullptr)判断,否则解引用直接崩溃 -
void f(int& r):编译器保证r绑定到有效对象,不用判空,语法也更干净(无*和&噪声) - 指针可被重新赋值(
p = &x),引用一旦绑定就不能改目标——这既是限制,也是安全保证
常量引用是“只读大对象”的黄金组合
想安全地读一个 5MB 的 std::vector<:byte></:byte>,又不想拷贝,就用 const std::vector<:byte>& data</:byte>。它既避免拷贝,又防止函数内部误改数据:
立即学习“C++免费学习笔记(深入)”;
-
const T&可绑定临时对象(如f("hello")中的字面量字符串),T&不行 -
const T&能延长临时对象生命周期至引用作用域结束,T*不能自动做到这点 - 别写
const T*代替const T&——多一层间接、多一次空检查、语法更啰嗦
实际写代码时,别盯着“哪个更快”,先问自己:要不要改原值?能不能接受空?要不要绑定临时量?答案清楚了,传参方式自然就定了。性能差异只在对象足够大时才显著,而语义错误带来的 bug,往往比慢几纳秒难查得多。



















