要使用 boost::object_pool 实现映射的自定义分配器,如何使用 boost::object_pool 分

To use boost::object_pool to implement custom allocator for map, How to allocate n continuous elements using boost::object_pool?

本文关键字:pool object boost 分配器 自定义 何使用 实现 映射      更新时间:2023-10-16

我想为std::map指定allocator。所以编写自定义代码,从这里获取 Josuttis 的基本代码。我想使用boost::object_pool来获得高性能。但是boost::object_pool没有提供接口功能所需的n连续元素来分配

pointer allocate (size_type num, const void* = 0)

allocator.

如何在boost::objet_pool中分配n个连续元素?任何其他开源对象池都提供相同的功能。

我看到boost::simple_segregated_storage有界面

void * malloc_n(size_type n, size_type partition_sz);

void free_n(void * chunks, size_type n,size_type partition_sz);

需要分配元素的大小,我认为这不容易用作对象池。

下面的答案是纯粹的黑客,使用boost::object_pool来实现std::map的自定义allocator。需要在平台上测试解决方案(特定版本的操作系统,编译器,boost和c ++ std lib组合(。

似乎std::map ,从不请求多个元素的连续内存,因此您可以实现分配器的 API pointer allocate (size_type num, const void* = 0)来仅分配单个元素,即key-value对,因为num总是 1。

我检查了插入多个元素的情况,复制地图的构造函数,通过一次调用将多个元素插入地图,以使用begin iteratorend iterator另一个地图传递元素范围map::insert

在 RHEL7、boost 1.57.0、gcc 版本 4.8.2 20140120(红帽 4.8.2-16(上进行了测试