我目前正在学习C++中的unique_ptr
和shared_ptr
类型。 智能指针相对于原始指针的优势是显而易见的,并且有很多解释为什么您应该更喜欢它们而不是原始指针。 我正在努力理解的是,为什么你会特别选择使用unique_ptr
而不是shared_ptr
?
据我所知,从程序员的角度来看(忽略实现(,unique_ptr
似乎只是引用计数限制为一个shared_ptr
的特殊情况版本。 因此,如果我创建一个shared_ptr
并且只创建单个引用,那么我基本上具有unique_ptr
的实用性(将来可以使用shared
部分(。
那么unique_ptr
给你带来什么优势呢? 我应该承认,我作为一个Java程序员来处理这个问题,shared_ptr
似乎非常接近Java的工作方式。
unique_ptr
似乎只是引用计数限制为一个shared_ptr
的特殊情况版本
这不是真的,也是你为什么会使用一个或另一个的关键。shared_ptr
是引用计数指针。 为了使它是线程安全的,它使用原子计数器进行引用计数。 因此,这意味着对于shared_ptr
,您有存储引用计数器的额外开销,以及在影响它的所有函数中检查/操作该计数器的执行开销。 此开销会对性能产生明显影响
相反,unique_ptr
是非引用计数指针。 它可以在没有参考计数器的情况下逃脱,因为它是不可复制的。 这意味着它基本上是一个零成本的抽象,用于new
和delete
指针。
所以,如果你永远不需要分享所有权,或者你可以把它从一个地方移动到另一个地方,你想要自我管理,那么你需要一个unique_ptr
。 这涵盖了绝大多数指针用例。 当您确实需要共享所有权时,您可以继续使用shared_ptr
,但要明白您会因共享所有权而遭受性能损失。