我可以使用提升池作为存储来支持提升侵入式集合吗
Can I back a boost intrusive collection using boost pool as storage?
我知道boost侵入式集合最终存储对对象的引用,因此对象需要自己的生存期管理。
我想知道我是否可以简单地使用提升池来管理这一生。当我想在boost侵入列表中存储一个新对象时,我可以从boost池中分配一个对象并将其存储在列表中吗?然后,当我从列表中删除时,我会使用提升池解除分配。
答案是肯定的。
这也不是很典型。
如果您想控制何时和分配内存的位置,请使用池。
如果您想将数据结构的内存布局与其语义解耦,那么您可以使用一个侵入式容器。
因此,有一个最佳点,但它看起来更像:
- 用侵入式钩子装饰元素类型(例如,用于侵入式地图)
- 在某种类型的"最佳"内存布局中创建新元素(这很可能是
vector<MyElement, custom_allocator>
)
松散的评论:
-
然后当我从列表中删除时,我使用提升池解除分配
使用池的一个典型场景是,当您想/不想/必须解除分配元素时(注意非平凡的析构函数)。否则,您只需将低效的堆本地转移到池(碎片、锁定)
-
对象需要自己的生命周期管理
这听起来有点离谱。事实上,对象不需要有"自己的"生命周期管理。只是他们的生命周期不受他们参与的侵入性数据结构的控制。
例如,通过将所有元素存储在向量中,可以获得连续存储,并且所有元素的寿命由向量[1]控制。因此,您可以将元素生存期和分配与容器语义解耦
[1]通常通过预先预留足够的容量来防止围绕向量重新分配的任何问题。如果你这样做,你会意识到这与固定大小的池分配器非常相似,但增加了零碎片的保证。如果您不需要后者,您可以执行list<T, pool_allocator<T> >
,这样您就可以在插入/删除时获得引用的局部性但稳定的引用。等等
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 如何将ampl中的集合表示为c++中的向量
- 为什么istream不支持右值提取
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 集合上的输出迭代器:assign和increment迭代器
- 扩展光电二极管探测器以支持多个传感器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- MSVC是否支持C++11样式的属性而不是__declspec
- 支持多线程方法来构建数组中所有元素的集合吗
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 我可以使用提升池作为存储来支持提升侵入式集合吗
- 收到此错误时如何实现非托管线程安全集合: <mutex> 使用 /clr 编译时不支持
- 如何在c++中为自己的集合类添加foreach迭代支持?