【发布时间】:2010-03-21 09:14:55
【问题描述】:
在过去的几年里,我普遍接受这一点
如果我要使用引用计数的智能指针
侵入式智能指针是要走的路
--
但是,由于以下原因,我开始喜欢非侵入式智能指针:
- 我只使用智能指针(所以周围没有 Foo*,只有 Ptr)
- 我开始为每个类构建自定义分配器。 (所以 Foo 会重载 operator new)。
- 现在,如果 Foo 有一个所有 Ptr 的列表(使用非侵入式智能指针很容易做到)。
- 然后,我可以避免内存碎片问题,因为类 Foo 移动对象(并且只更新相应的 Ptr)。
这个 Foo 在非侵入式智能指针中移动对象比侵入式智能指针更容易的唯一原因是:
在非侵入式智能指针中,只有一个指针指向每个 Foo。
在侵入式智能指针中,我不知道有多少对象指向每个 Foo。
现在,非侵入式智能指针的唯一成本......是双重间接。 [也许这会破坏缓存]。
有没有人好好研究过这个额外的间接层是昂贵的?
编辑:通过智能指针,我可能指的是其他人所说的“共享指针”;整个想法是:有一个引用计数附加到对象,当它达到 0 时,对象会被自动删除
【问题讨论】:
-
我想你所说的智能指针是指共享指针(这是一种智能指针)。我在 shared_ptr 方面遇到了太多问题(通常是破坏顺序问题,尤其是在线程系统中),因此认为通常不鼓励使用共享指针。到目前为止,自动存储仍然是最好的选择(在合适的情况下),甚至在其他地方,scoped_ptrs 通常是比 shared_ptrs 更好的选择。
-
@Tronic:我编写了自己的侵入式智能指针。我在多线程问题中使用它们。我从来没有遇到过销毁订单问题。这些只在多线程情况下才会出现的销毁顺序问题是什么?
-
假设您有两个不同的智能指针对象,它们共享一个指针对象。假设有两个线程想要复制每个智能指针(所以你最终得到 4 个)。这里的问题是,即使对象本身从未被触及,引用计数器的访问也必须同步。
标签: c++