我理解 boost 侵入式集合最终存储对对象的引用,因此对象需要自己的生命周期管理。
我想知道我是否可以简单地使用 boost 池来管理该生命周期。当我想在 boost 侵入列表中存储一个新对象时,我可以从 boost 池中分配一个对象并将其存储在列表中吗?然后,当我从列表中删除时,我会使用 boost 池解除分配。
最佳答案
答案是肯定的。
也不是很典型。
如果您想控制分配内存的时间和位置,您可以使用池。
如果您想分离数据结构的内存布局及其语义,您可以使用侵入式容器。
所以,有一个最佳点,但它看起来更像:
- 用侵入式 Hook 装饰元素类型(例如用于侵入式 map )
- 您在某种类型的“最佳”内存布局中创建新元素(这很可能是
vector<MyElement, custom_allocator>
)
宽松的评论:
-
then when I delete from the list then I deallocate using boost pool
使用池的一个典型场景是当您想要/不/必须释放元素时(当心非平凡的析构函数)。否则,您只是将本地堆的低效率转移到池(碎片,锁定)
-
the objects need their own lifetime management
这听起来有点不对劲。事实上,对象不需要有“自己的”生命周期管理。只是它们的生命周期不受它们参与的侵入式数据结构的支配。
例如通过将所有元素存储在一个 vector 中,您可以获得连续存储,并且所有元素的生命周期都由 vector [1] 控制。因此,您可以将元素生命周期和分配与容器语义分离
[1] 任何围绕 vector 重新分配的问题通常都可以通过预先预留足够的容量来避免。如果这样做,您会意识到这与固定大小的池分配器非常相似,但增加了零碎片的保证。如果你不需要后者,你可以做 list<T, pool_allocator<T> >
因此您可以获得引用的位置,但可以在插入/删除时获得稳定的引用。等等等等
关于c++ - 我可以使用 boost 池作为存储来支持 boost 侵入式收集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917877/