我理解提升侵入式集合最终会存储对象的引用,因此这些对象需要自己的生命周期管理。
我想知道我是否可以简单地使用boost池来管理那一生。当我想在boost侵入列表中存储一个新对象时,我可以从boost池中分配一个对象并将其存储在列表中吗?然后当我从列表中删除然后我使用boost池解除分配。
答案 0 :(得分:1)
答案是肯定的。
这也不是很典型。
如果要在和分配内存时控制,则使用池。
如果要分离数据结构的内存布局及其语义,则使用侵入式容器。
所以,有一个最佳点,但看起来更像是:
vector<MyElement, custom_allocator>
)宽松的评论:
然后当我从列表中删除然后我使用提升池解除分配
使用池的典型方案明确表示您希望/不需要/必须解除分配元素(谨防非平凡的析构函数)。否则,您只是将堆本地的低效率移到池中(碎片,锁定)
对象需要自己的生命周期管理
这听起来有点偏。实际上,对象不需要“自己的”终身管理。只是他们的生命周期不受他们参与的侵入式数据结构的控制。
E.g。通过将所有元素存储在向量中,您将获得连续存储,并且所有元素的生命周期由向量 [1] 控制。因此,您可以从容器语义中分离元素生存期和分配
[1] 通过预先保留足够的容量,通常可以防止任何与矢量重新分配有关的问题。如果这样做,您将意识到这与固定大小的池分配器非常相似,但增加了零碎片的保证。如果您不需要后者,则可以执行list<T, pool_allocator<T> >
,以便获得引用的位置,但在插入/删除时获得稳定的引用。等等。