c++ - C++ 中的侵入式与非侵入式引用计数指针

标签 c++

在过去的几年里,我普遍接受了这一点

如果我要使用引用计数的智能指针

侵入式智能指针是必经之路

--

但是,由于以下原因,我开始喜欢非侵入式智能指针:

  1. 我只使用智能指针(所以没有 Foo*,只有 Ptr)
  2. 我开始为每个类(class)构建自定义分配器。 (所以 Foo 会重载 operator new)。
  3. 现在,如果 Foo 有所有 Ptr 的列表(使用非侵入式智能指针很容易做到)。
  4. 然后,我可以避免内存碎片问题,因为类 Foo 移动对象(并且只更新相应的 Ptr)。

这个 Foo 在非侵入式智能指针中移动对象比侵入式智能指针更容易的唯一原因是:

在非侵入式智能指针中,只有一个指针指向每个 Foo。

在侵入式智能指针中,我不知道有多少对象指向每个 Foo。

现在,非侵入式智能指针的唯一成本……是双重间接寻址。 [也许这会搞砸缓存]。

有没有人很好地研究过这个额外的间接层是昂贵的?

编辑:通过智能指针,我可能指的是其他人所说的“共享指针”;整个想法是:有一个附加到对象的引用计数,当它达到 0 时,该对象将被自动删除

最佳答案

侵入式指针和非侵入式指针之间有几个重要的区别:

second(非侵入式)的最大优势:

  • 实现对第二个弱引用(即 shared_ptr/weak_ptr)要简单得多。

first 的优点是当你需要在这上面获得智能指针时(至少在 boost::shared_ptrstd::tr1::shared_ptr 的情况下)

  • 您不能在构造函数和析构函数中使用 shared_ptr
  • 在类的层次结构中有 shared_from this 是非常重要的。

关于c++ - C++ 中的侵入式与非侵入式引用计数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486493/

相关文章:

c++ - VS 2008 中的 Visual C++ Redistributable Installer 在哪里?

c++ - 指针传递,内存泄漏

c++ - HippoMocks - 在 "ExpectCallFunc"之后使用 "NeverCallFunc"来实现相同的功能会导致意外的 "HippoMocks::ExpectationException"

c++ - 如何判断插入的CD是不是Audio CD?

c++ - 如何设计可以处理不同数量的参数或具有任意参数类型组合的函数接口(interface)?

c++ - 在电子邮件地址内移动点(句点)的算法

c++ - 为什么auto不能作为函数声明的返回类型

c++ - 将现有的类结构移植到智能指针

c++ - 如何将多个用户输入添加到数组?

c++ - 将库添加到链接器