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

标签 c++ boost object-lifetime intrusive-containers

我理解 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/

相关文章:

c++17: 一个从未被销毁的临时对象

c++ - 指向类数据成员 "::*"的指针

c++ - 右值的成员访问运算符应该是一个 xvalue 吗?

c++ - 对象具有阻止匹配的类型限定符(未找到函数重载)

boost - 如何找到两个矩形之间距离最近的两点?

c++ - 如何将 'CDT' 转换为 time_zone_ptr

c++ - C++头文件获取失败

c++ - 在几分钟内构建所有的 Boost

c++ - 局部变量是在评估函数返回值之前还是之后销毁的?

c++ - 通过加入析构函数来等待异步工作是否安全?