2

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

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

4

1 回答 1

1

答案是肯定的。

这也不是很典型。

如果要控制分配内存的时间位置,请使用池。

如果你想解耦数据结构的内存布局和它的语义,你可以使用一个侵入式容器。

所以,有一个甜蜜点,但它看起来更像:

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

松散的备注:

  • 然后当我从列表中删除时,我使用 boost pool 解除分配

    一个典型的使用池的场景是当你想/不/必须释放元素时(当心非平凡的析构函数)。否则,您只需将本地堆的低效率移到池中(碎片,锁定)

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

    这听起来有点不对劲。事实上,对象不需要有“自己的”生命周期管理。只是他们的生命周期不受他们参与的侵入性数据结构的支配。

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


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

于 2014-09-18T22:56:05.037 回答