为何Clang-Tidy提示shared_ptr副本未修改?const引用为何最优?
原代码
shared_ptr<int> sp1(new int(10)); shared_ptr<int> sp3(sp1); *sp3 = 20;
Clang-Tidy提示信息
Clang-Tidy: Local copy 'sp3' of the variable 'sp1' is never modified; consider avoiding the copy
一、提示的原因
- 你通过
shared_ptr<int> sp3(sp1)创建sp3时,执行的是shared_ptr的拷贝构造:会生成一个全新的shared_ptr实例,同时将内部的引用计数原子性地加1(从1变为2)。 - 但你的代码中,仅通过
*sp3修改了指针指向的int对象,从未对sp3本身做任何修改(比如重新赋值其他shared_ptr、调用reset()等操作)。 - 这种不必要的拷贝会带来无意义的开销:虽然shared_ptr的拷贝开销不算大,但引用计数的增减是线程安全的原子操作,在高频调用场景下会积累性能损耗;从语义上来说,你只是需要一个能访问sp1指向对象的“别名”,完全不需要创建新的shared_ptr实例。
二、为什么const shared_ptr<int>& sp3(sp1)是最优修改方案
- 彻底消除拷贝开销:使用const引用绑定sp1,不会创建新的shared_ptr实例,也就不会触发引用计数的原子操作,完全避免了拷贝带来的性能损耗。
- 语义精准匹配:
const修饰符明确告知编译器和其他开发者,这个引用不会被用来修改sp1本身(比如不能给sp3赋值新的shared_ptr),和你代码的实际行为完全一致——你只操作了指针指向的对象,没有改动shared_ptr容器本身。 - 编译期安全保障:const引用会被编译器强制约束,任何试图修改sp3本身的操作(比如
sp3 = make_shared<int>(30))都会直接触发编译错误,从根源上避免误操作;同时引用的生命周期与sp1绑定,只要sp1处于存活状态,sp3就能安全访问指向的对象。
内容的提问来源于stack exchange,提问作者zilliax
相关产品推荐
相关产品推荐

