我可以使用boost池作为存储来支持提升侵入式集合吗?

时间:2014-09-18 16:27:29

标签: c++ boost object-lifetime intrusive-containers

我理解提升侵入式集合最终会存储对象的引用,因此这些对象需要自己的生命周期管理。

我想知道我是否可以简单地使用boost池来管理那一生。当我想在boost侵入列表中存储一个新对象时,我可以从boost池中分配一个对象并将其存储在列表中吗?然后当我从列表中删除然后我使用boost池解除分配。

1 个答案:

答案 0 :(得分:1)

答案是肯定的。

这也不是很典型。

如果要在和分配内存时控制,则使用池。

如果要分离数据结构的内存布局及其语义,则使用侵入式容器。

所以,有一个最佳点,但看起来更像是:

  • 用侵入式钩子装饰元素类型(例如用于侵入式地图)
  • 您在某种类型的“最佳”内存布局中创建新元素(这可能是vector<MyElement, custom_allocator>

宽松的评论:

  •   

    然后当我从列表中删除然后我使用提升池解除分配

    使用池的典型方案明确表示您希望/不需要/必须解除分配元素(谨防非平凡的析构函数)。否则,您只是将堆本地的低效率移到池中(碎片,锁定)

  •   

    对象需要自己的生命周期管理

    这听起来有点偏。实际上,对象不需要“自己的”终身管理。只是他们的生命周期不受他们参与的侵入式数据结构的控制。

    E.g。通过将所有元素存储在向量中,您将获得连续存储,并且所有元素的生命周期由向量 [1] 控制。因此,您可以从容器语义中分离元素生存期和分配


[1] 通过预先保留足够的容量,通常可以防止任何与矢量重新分配有关的问题。如果这样做,您将意识到这与固定大小的池分配器非常相似,但增加了零碎片的保证。如果您不需要后者,则可以执行list<T, pool_allocator<T> >,以便获得引用的位置,但在插入/删除时获得稳定的引用。等等。