C++ 我可以使用boost池作为存储支持boost入侵收集吗?

C++ 我可以使用boost池作为存储支持boost入侵收集吗?,c++,boost,object-lifetime,intrusive-containers,C++,Boost,Object Lifetime,Intrusive Containers,我知道boost侵入式集合最终会存储对对象的引用,因此对象需要自己的生命周期管理 我想知道我是否可以简单地使用boostpool来管理这个生命周期。当我想在boost入侵列表中存储一个新对象时,我可以从boost池中分配一个对象并将其存储在列表中吗?然后,当我从列表中删除时,我使用boostpool解除分配。答案是肯定的 这也不是很典型 如果要控制何时何地分配内存,可以使用池 如果要将数据结构的内存布局与其语义解耦,可以使用侵入式容器 因此,有一个最佳点,但它看起来更像: 用插入式挂钩装饰元素

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

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

答案是肯定的

这也不是很典型

如果要控制何时何地分配内存,可以使用池

如果要将数据结构的内存布局与其语义解耦,可以使用侵入式容器

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

  • 用插入式挂钩装饰元素类型(例如,用于插入式贴图)
  • 您可以在某种类型的“最佳”内存布局中创建新元素(这很可能是一个
    向量

松散的评论:

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

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

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

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

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



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

我认为boost::pool可能优于vector,因为它在分配和释放节点时会隐式地照顾内存。@Nathandromal关于vector或deque有什么区别?区别在于当我们到达vector或deque的末尾时,需要分配更多节点。隐式地两者都使用分配器,并且都使用额外的动态内存,除非使用自定义分配器,否则不会跟踪这些内存。通过使用boostpool,我摆脱了这种额外的管理,一次就可以最干净地处理生命周期管理和动态内存管理。