unique_ptr相对于shared_ptr的优势是什么

What is the advantage of a unique_ptr over a shared_ptr

本文关键字:ptr 是什么 shared 相对于 unique      更新时间:2023-10-16

我目前正在学习C++中的unique_ptrshared_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是非引用计数指针。 它可以在没有参考计数器的情况下逃脱,因为它是不可复制的。 这意味着它基本上是一个零成本的抽象,用于newdelete指针。

所以,如果你永远不需要分享所有权,或者你可以把它从一个地方移动到另一个地方,你想要自我管理,那么你需要一个unique_ptr。 这涵盖了绝大多数指针用例。 当您确实需要共享所有权时,您可以继续使用shared_ptr,但要明白您会因共享所有权而遭受性能损失。