我的答案与其他答案不同,我真的很想知道他们是否曾经分析过代码。
shared_ptr的创建开销很大,因为它为控制块分配了内存(保留了ref计数器和指向所有弱引用的指针列表)。因此,它还有巨大的内存开销,而且std :: shared_ptr始终是2指针元组(一个指向对象,一个指向控制块)。
如果将shared_pointer作为值参数传递给函数,则它将比普通调用至少慢10倍,并在代码段中创建大量代码以展开堆栈。如果通过引用传递它,则会获得其他间接访问,这在性能方面也可能会更差。
因此,除非该功能确实涉及所有权管理,否则您不应该这样做。否则,请使用“ shared_ptr.get()”。它不能确保在正常的函数调用期间不会杀死您的对象。
如果您发疯并在诸如编译器中的抽象语法树之类的小对象上或在任何其他图形结构中的小节点上使用shared_ptr,您将看到性能下降和内存增加。我看到了一个解析器系统,该系统在C ++ 14投放市场之后以及程序员学会正确使用智能指针之前不久就被重写了。重写比旧代码慢了一个数量级。
这不是灵丹妙药,根据定义,原始指针也不错。糟糕的程序员是坏人,不良的设计是坏人。谨慎设计,设计时要明确所有权,并尝试主要在子系统API边界上使用shared_ptr。
如果您想了解更多信息,可以观看Nicolai M. Josuttis关于“ C ++中共享指针的实际价格”的精彩演讲,网址为https://vimeo.com/131189627
。锁等。一旦您聆听,您将永远不会谈论此功能便宜。如果只想证明幅度更慢,请跳过前48分钟,看看他运行的示例代码在任何地方使用共享指针时,运行速度都要慢180倍(与-O3编译)。