const引用传参能避免拷贝,因其是原对象别名,不触发拷贝构造且为语言语义保证;适合大型或不可移动对象的只读访问,但小型类型传值更高效。
当函数参数是大型对象(比如 std::vector、自定义类等)时,按值传递会触发完整拷贝构造,开销明显。而 const T& 本质是别名,不分配新内存,也不调用拷贝构造函数——只要原对象生命周期覆盖函数调用期,

注意:这不是“编译器优化”的结果,而是语言语义保证的行为。即使关闭所有优化(-O0),const T& 依然不拷贝。
适合场景有明确边界:
std::string、std::map)std::mutex 的类)反例:内置类型(int、double)、小型 POD(如二维点 struct {float x,y;})——传值更高效,因为引用本身在 x64 上常是 8 字节指针,反而更大。
看似安全,但几个细节容易翻车:
const T&& 或 C++11 后的“延长临时对象生命周期”规则,但仅限于直接绑定,经函数参数转发会失效)const 成员函数(比如误写 obj.modify()),编译直接报错:error: passing 'const T' as 'this' argument discards qualifiers
void f(const std::string& s) 能接 f("hello")),但实际构造了临时 std::string,仍有一次构造开销——这不是拷贝,但也不是零成本选择依据不是“统一风格”,而是数据流向和所有权:
const T&
T(值传参)T&&,配合 std::move
例如:void process(const std::vector 安全;void store(std::vector 表示接收后会 move 进成员变量;而 void calc(int x) 比 const int& x 更自然也更快。
最易被忽略的是:const 引用无法阻止底层数据被多线程修改(它只禁写,不提供同步),并发场景下仍需额外保护。