在老旧大型代码库中,应选用哪种指针优化代码可读性?
咱维护老旧大型代码库的都懂——长到离谱的成员变量名+反复写std::shared_ptr的调用,代码看着就像裹了层棉花,读起来特别费劲。针对你说的场景,直接上结论:优先用局部的std::shared_ptr<T>&(或const版本),这是最安全高效的方案,下面给你掰扯清楚为啥:
为啥选std::shared_ptr<T>&?
- 零性能开销:引用直接绑定到原成员变量的shared_ptr上,不会触发任何引用计数的增减操作——既不用像复制shared_ptr那样额外加计数,也不会有原始指针的悬空风险。
- 代码瞬间清爽:把那些长到离谱的属性名换成短别名,可读性直接拉满:
// 原来的冗长代码 if (m_first_username->isSomethingOrOther() || m_second_username->isOtherOrSomething()) { // ... } // 用引用简化后 auto& firstUser = m_first_username; auto& secondUser = m_second_username; if (firstUser->isSomethingOrOther() || secondUser->isOtherOrSomething()) { // ... } - 安全性拉满:只要你是在类的成员函数里用这个局部引用,成员变量的生命周期肯定比局部变量长,完全不会出现悬空引用的问题。如果只是读操作,更推荐用
const std::shared_ptr<T>&——能防止你不小心修改原shared_ptr(比如误调用reset()),进一步降低风险:const auto& firstUser = m_first_username; // 只能调用const成员函数,避免误改原shared_ptr if (firstUser->isSomethingOrOther()) { // ... }
为啥别选其他方案?
- 复制std::shared_ptr:比如
auto firstUser = m_first_username;,这会增加引用计数,虽然大部分场景下性能影响不大,但完全没必要——咱只是想简化访问,不是要共享所有权,额外的计数操作纯粹是做无用功,复杂场景下还可能带来线程同步的额外开销。 - 原始指针(T)*:用
get()获取原始指针确实也能简化,但风险太高——如果原shared_ptr在局部作用域内被意外reset()(老旧代码谁知道有没有隐藏的操作?),这个原始指针就直接悬空了,后续调用就是未定义行为,踩坑概率直线上升。
总结
- 只读场景:选
const std::shared_ptr<T>&,安全高效还能防误改; - 需要修改原shared_ptr的场景:选
std::shared_ptr<T>&; - 别碰复制shared_ptr和原始指针,前者浪费性能,后者容易踩坑。
内容的提问来源于stack exchange,提问作者ruipacheco
相关产品推荐
相关产品推荐

