scoped_ptr
不可复制,正在从范围中删除。所以它是一种限制shared_ptr
。因此,除了确实需要限制复制操作的情况外,似乎shared_ptr
更好用。因为有时您不知道是否需要创建对象的副本。所以问题是:除了上面提到的情况外,我们是否可以认为shared_ptr
更好(或推荐)使用而不是scoped_ptr
. 是否scoped_ptr
工作得更快shared_ptr
,或者它有什么优势?
谢谢!
scoped_ptr
不可复制,正在从范围中删除。所以它是一种限制shared_ptr
。因此,除了确实需要限制复制操作的情况外,似乎shared_ptr
更好用。因为有时您不知道是否需要创建对象的副本。所以问题是:除了上面提到的情况外,我们是否可以认为shared_ptr
更好(或推荐)使用而不是scoped_ptr
. 是否scoped_ptr
工作得更快shared_ptr
,或者它有什么优势?
谢谢!
shared_ptr
比 更重量级scoped_ptr
。它需要分配和释放一个引用计数对象以及托管对象,并处理线程安全的引用计数——在我工作的一个平台上,这是一个很大的开销。
我的建议(一般而言)是使用满足您需求的最简单的对象。如果您需要引用计数共享,请使用shared_ptr
; 如果您只需要在完成单个引用后自动删除,请使用scoped_ptr
.
性能-shared_ptr
具有更多功能,但也需要额外的分配(它也更大,但这并不重要)。
[编辑] 使用 可以避免第二次分配make_shared
,但weak_ptr
即使在对象被销毁后也会保留整个分配,这对于大对象可能是个问题。
使用您的意图scoped_ptr
表达更明确地说明您想要做什么。(如果您想知道 - 这是一件好事:))。如果您正确执行此操作,shared_ptr 还将指示“此对象旨在超出此范围”
它们的预期目的不同,因此,在许多情况下,“shared_ptr vs scoped_ptr”根本不是问题。当然,当您只需要一个 scoped_ptr 时,您可以使用 shared_ptr。但有什么意义呢?shared_ptr 的开销可能会稍大一些,涉及到所有引用计数。
scoped_ptr
从 . 开始工作得更快shared_ptr
。这是正确的。shared_ptr
始终使用分配器或默认分配器分配内存。
Scoped_ptr 与 shared_ptr、weak_ptr 或 unique_ptr 几乎没有共同之处,因为它只是在做非常特殊的“引用计数”。在精心设计的代码中,这不是您经常需要的东西,但它是一个很好的工具。
基本上, scoped_ptr 根本不是引用计数的东西。相反,它是您在堆栈上(在本地范围内)创建的对象,因此您可以执行以下操作:
//Some enclosing scope- anything set off by "{}" or even a function:
{
scoped_ptr<MyObject> ptr = new MyObject( parameters...);
} // When we hit this closing brace, "ptr" will delete the "MyObject" inside.
您更倾向于在互斥锁和其他同步原语中看到这种模式——我可以声明一个“AutoLock”,它将锁定传递给它的互斥锁,然后在它删除时解锁它,将整个“{}”范围变成一个关键部分。
另请注意,“scoped_ptr”只有在您出于某种原因不能像“MyObject obj(params..)”这样的普通堆栈分配时才有意义。毕竟,它所做的是让您使用堆分配的对象,就好像它是堆栈上的对象一样。与 shared_ptr 及其表亲的引用计数相比,这往往是一个更罕见的用例。