在过去的几年里,我普遍接受了这一点
如果我要使用引用计数的智能指针
侵入式智能指针是必经之路
--
但是,由于以下原因,我开始喜欢非侵入式智能指针:
- 我只使用智能指针(所以没有 Foo*,只有 Ptr)
- 我开始为每个类(class)构建自定义分配器。 (所以 Foo 会重载 operator new)。
- 现在,如果 Foo 有所有 Ptr 的列表(使用非侵入式智能指针很容易做到)。
- 然后,我可以避免内存碎片问题,因为类 Foo 移动对象(并且只更新相应的 Ptr)。
这个 Foo 在非侵入式智能指针中移动对象比侵入式智能指针更容易的唯一原因是:
在非侵入式智能指针中,只有一个指针指向每个 Foo。
在侵入式智能指针中,我不知道有多少对象指向每个 Foo。
现在,非侵入式智能指针的唯一成本……是双重间接寻址。 [也许这会搞砸缓存]。
有没有人很好地研究过这个额外的间接层是昂贵的?
编辑:通过智能指针,我可能指的是其他人所说的“共享指针”;整个想法是:有一个附加到对象的引用计数,当它达到 0 时,该对象将被自动删除
最佳答案
侵入式指针和非侵入式指针之间有几个重要的区别:
second(非侵入式)的最大优势:
- 实现对第二个弱引用(即
shared_ptr
/weak_ptr
)要简单得多。
first 的优点是当你需要在这上面获得智能指针时(至少在 boost::shared_ptr
、std::tr1::shared_ptr
的情况下)
- 您不能在构造函数和析构函数中使用
shared_ptr
。 - 在类的层次结构中有 shared_from this 是非常重要的。
关于c++ - C++ 中的侵入式与非侵入式引用计数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486493/