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的工作方式。
unique_ptr
似乎只是引用计数限制为一个shared_ptr
的特殊情况版本
这不是真的,也是你为什么会使用一个或另一个的关键。shared_ptr
是引用计数指针。 为了使它是线程安全的,它使用原子计数器进行引用计数。 因此,这意味着对于shared_ptr
,您有存储引用计数器的额外开销,以及在影响它的所有函数中检查/操作该计数器的执行开销。 此开销会对性能产生明显影响
相反,unique_ptr
是非引用计数指针。 它可以在没有参考计数器的情况下逃脱,因为它是不可复制的。 这意味着它基本上是一个零成本的抽象,用于new
和delete
指针。
所以,如果你永远不需要分享所有权,或者你可以把它从一个地方移动到另一个地方,你想要自我管理,那么你需要一个unique_ptr
。 这涵盖了绝大多数指针用例。 当您确实需要共享所有权时,您可以继续使用shared_ptr
,但要明白您会因共享所有权而遭受性能损失。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- "[ptr, ptr+len) must be a valid range"是什么意思?
- 这是什么意思 *ptr = len
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- 这个声明"int(*ptr[3])();"是什么意思?
- (ptr语言 - A[0]) / (sizeof(A[0]) / sizeof(A[0][0]))的类型是什么?< /
- 'Bad Ptr'在视觉C++中是什么意思?
- C ++ STL 字符串<错误的 PTR>但有字符串值是什么意思?
- MOV EAX, DWORD PTR SS:[EBP+8h] 的含义是什么,我怎样才能把它翻译成 AT&T 格式?
- c中**ptr的含义是什么