2014-09-18 15 views
1

我明白,增强入侵集合最终存储对象的引用,因此对象需要他们自己的生命周期管理。我可以使用boost池作为存储来支持增强入侵集合吗?

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

回答

1

答案是肯定的。

这也不是很典型。

如果你想控制其中内存分配,你使用一个池。

如果要解耦数据结构的内存布局及其语义,请使用侵入式容器。

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

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

宽松的言论:

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

    使用池一个典型的场景是明确当你想/不/有解除分配要素(谨防不平凡的破坏者)。否则,你只需动动手堆当地池的低效率(碎片),上锁

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

    这听起来稍微偏离。事实上,客体不需要有“他们自己的”终身管理。只是它们的生命不是,它们是由它们参与的侵入式数据结构控制的。

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


[1]周围矢量再分配任何问题通常通过保留足够的能力预先防止分离元件寿命和分配。如果你这样做,你会意识到这与固定大小的池分配器非常相似,但具有零碎片的额外保证。如果你不需要后者,你可以做一个list<T, pool_allocator<T> >,这样你就可以获得参考的位置,但可以在插入/删除时获得稳定的参考。等等

+0

我认为boost :: pool可以优于vector,因为它在分配和释放节点时隐式地处理内存。 – 2014-09-19 13:24:27

+0

@NathanDoromal在这方面与vector,deque有什么区别? – sehe 2014-09-19 15:22:38

+0

不同之处在于,我们碰到了vector或deque的末尾,需要分配更多的节点。隐式地都使用分配器,并且都使用额外的动态内存,除非使用自定义分配器,否则本身不会被追踪。通过使用Boost池,我摆脱了这种额外的管理,并且一气呵成地处理了生命周期管理和动态内存管理。 – 2014-09-19 18:44:30

相关问题