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

Can I back a boost intrusive collection using boost pool as storage?

本文关键字:支持 集合 可以使 我可以 存储      更新时间:2023-10-16

我知道boost侵入式集合最终存储对对象的引用,因此对象需要自己的生存期管理。

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

答案是肯定的。

这也不是很典型。

如果您想控制何时分配内存的位置,请使用池。

如果您想将数据结构的内存布局与其语义解耦,那么您可以使用一个侵入式容器。

因此,有一个最佳点,但它看起来更像:

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

松散的评论:

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

    使用池的一个典型场景是,当您想/不想/必须解除分配元素时(注意非平凡的析构函数)。否则,您只需将低效的堆本地转移到池(碎片、锁定)

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

    这听起来有点离谱。事实上,对象不需要有"自己的"生命周期管理。只是他们的生命周期不受他们参与的侵入性数据结构的控制。

    例如,通过将所有元素存储在向量中,可以获得连续存储,并且所有元素的寿命由向量[1]控制。因此,您可以将元素生存期和分配与容器语义解耦


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