unique_ptr 比 shared_ptr 有什么优势
What is the advantage of a unique_ptr over a shared_ptr
我目前正在学习 C++ 中的 unique_ptr
和 shared_ptr
类型。智能指针相对于原始指针的优势是显而易见的,并且有很多解释为什么您应该更喜欢它们而不是原始指针。我很难理解的是 为什么你会特别选择使用 unique_ptr
而不是 shared_ptr
?
据我所知,从程序员的角度(忽略实现),unique_ptr
看起来像是 shared_ptr
的特例版本,其中引用计数限制为一个。因此,如果我创建一个 shared_ptr
并且只创建一个引用,那么我基本上拥有 unique_ptr
的实用程序(将来可以使用 shared
部分)。
那么 unique_ptr
有什么好处呢?我应该承认,我是作为一名 Java 程序员来处理这个问题的,而 shared_ptr
似乎非常接近 Java 的工作方式。
a unique_ptr
just seems like a special-case version of a shared_ptr
where the reference count is restricted to one
这不是真的,这就是你为什么要使用一个或另一个的症结所在。 shared_ptr
是引用计数指针。为了使其成为线程安全的,它使用原子计数器进行引用计数。因此,这意味着对于 shared_ptr
你有存储引用计数器的额外开销,加上 checking/manipulating 的执行开销,该计数器在影响它的所有函数中。此开销会对性能产生显着影响
A unique_ptr
,反之,是一个非引用计数指针。它可以在没有引用计数器的情况下逃脱,因为它是不可复制的。这意味着它基本上是 new
ing 和 delete
ing 指针的零成本抽象。
因此,如果您永远不需要共享所有权,或者您可以将它从一个地方移动到另一个地方,并且您想要自我管理,那么您需要一个 unique_ptr
。这涵盖了绝大多数指针用例。当您真正需要共享所有权时,您可以继续使用 shared_ptr
,但要明白您会因该共享所有权而遭受性能损失。
我目前正在学习 C++ 中的 unique_ptr
和 shared_ptr
类型。智能指针相对于原始指针的优势是显而易见的,并且有很多解释为什么您应该更喜欢它们而不是原始指针。我很难理解的是 为什么你会特别选择使用 unique_ptr
而不是 shared_ptr
?
据我所知,从程序员的角度(忽略实现),unique_ptr
看起来像是 shared_ptr
的特例版本,其中引用计数限制为一个。因此,如果我创建一个 shared_ptr
并且只创建一个引用,那么我基本上拥有 unique_ptr
的实用程序(将来可以使用 shared
部分)。
那么 unique_ptr
有什么好处呢?我应该承认,我是作为一名 Java 程序员来处理这个问题的,而 shared_ptr
似乎非常接近 Java 的工作方式。
a
unique_ptr
just seems like a special-case version of ashared_ptr
where the reference count is restricted to one
这不是真的,这就是你为什么要使用一个或另一个的症结所在。 shared_ptr
是引用计数指针。为了使其成为线程安全的,它使用原子计数器进行引用计数。因此,这意味着对于 shared_ptr
你有存储引用计数器的额外开销,加上 checking/manipulating 的执行开销,该计数器在影响它的所有函数中。此开销会对性能产生显着影响
A unique_ptr
,反之,是一个非引用计数指针。它可以在没有引用计数器的情况下逃脱,因为它是不可复制的。这意味着它基本上是 new
ing 和 delete
ing 指针的零成本抽象。
因此,如果您永远不需要共享所有权,或者您可以将它从一个地方移动到另一个地方,并且您想要自我管理,那么您需要一个 unique_ptr
。这涵盖了绝大多数指针用例。当您真正需要共享所有权时,您可以继续使用 shared_ptr
,但要明白您会因该共享所有权而遭受性能损失。