【问题标题】:What is the advantage of a unique_ptr over a shared_ptr与 shared_ptr 相比,unique_ptr 有什么优势
【发布时间】:2019-09-30 19:17:16
【问题描述】:

我目前正在学习 C++ 中的 unique_ptrshared_ptr 类型。智能指针相对于原始指针的优势是显而易见的,并且有很多解释为什么你应该更喜欢它们而不是原始指针。我很难理解的是为什么你会特别选择使用unique_ptr 而不是shared_ptr

据我所知,从程序员的角度来看(忽略实现)unique_ptrjust 似乎是 shared_ptr 的特例版本,其中引用计数被限制为一个。因此,如果我创建了一个 shared_ptr 并且只创建了一个引用,那么我基本上就拥有了 unique_ptr 的实用性(将来可以使用 shared 部分)。

那么unique_ptr 能给你带来什么好处呢?我应该承认,我是作为一名 Java 程序员来处理这个问题的,shared_ptr 似乎非常接近 Java 的工作方式。

【问题讨论】:

  • 它使用起来更便宜(或者,更确切地说,它禁止昂贵的使用)并且它使程序逻辑更清晰,更容易推理。总的来说,大多数情况下,在 C++ 程序中您不需要shared_ptr,但极少例外。
  • unique_ptr 的优势在于它与 Java 的工作方式相差甚远。 unique_ptr 不需要在一些隐式创建的共享状态对象中分配或更新引用计数器。
  • 两者各有优缺点。这取决于您使用指针的上下文。
  • 这里有很多答案。 stackoverflow.com/questions/6876751
  • shared_ptrs 确实接近 Java 的工作方式。它们也昂贵

标签: c++ shared-ptr smart-pointers unique-ptr


【解决方案1】:

unique_ptr 似乎是 shared_ptr 的特例版本,其中引用计数被限制为一个

这是不正确的,这是您为什么要使用其中一个或另一个的症结所在。 shared_ptr 是一个引用计数指针。为了使其成为线程安全的,它使用原子计数器作为引用计数。这意味着对于shared_ptr,您需要额外的存储引用计数器的开销,以及在影响它的所有函数中检查/操作该计数器的执行开销。这种开销会对性能产生显着影响

相反,unique_ptr 是一个非引用计数指针。它可以在没有引用计数器的情况下逃脱,因为它不可复制。这意味着它基本上是 newing 和 deleteing 指针的零成本抽象。

因此,如果您从不需要共享所有权,或者您可以将其从一个地方转移到另一个地方,并且您想要自我管理,那么您需要unique_ptr。这涵盖了绝大多数指针用例。当您真正需要共享所有权时,您可以继续使用shared_ptr,但请理解您会因共享所有权而遭受性能损失。

【讨论】:

  • 我们不应该将共享原子对象的问题与有效线程本地原子对象的问题混为一谈:在普通 CPU 上进行分析表明,与简单的读取或读取相比,原子 RMW 操作的成本是巨大的在缓存行之前不在我们的缓存中的情况下写入(或其中的序列),如果仅在本地操作原子对象,这种情况很少发生。 (等待另一个缓存将所有权转移给我们,同时阻止所有其他内存操作,会产生巨大的影响。)本地 RMW 只是很慢。
猜你喜欢
  • 2017-08-13
  • 2016-07-04
  • 2011-03-13
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2010-09-24
  • 2010-12-27
  • 2011-11-06
相关资源
最近更新 更多