要使用boost :: object_pool为map实现自定义分配器,如何使用boost :: object_pool分配n个连续元素?

时间:2016-02-13 14:38:51

标签: c++ memory-management boost allocator

我想为allocator指定std::map。所以编写自定义的一个,从Josuttis的here获取基本代码。我想使用boost::object_pool来获得高性能。但是boost::object_pool不提供API来分配接口函数

所需的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);

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

1 个答案:

答案 0 :(得分:0)

以下回答是使用boost::object_poolallocator实施自定义std::map的纯粹黑客攻击。需要在平台上测试解决方案(特定版本的OS,编译器,boost和c ++ std lib组合)。

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

我检查了插入多个元素的情况,复制地图的构造函数,将多个元素插入到地图中,只需调用num使用map::insertbegin iterator传递元素的范围另一张地图。

在RHEL7上测试,增强1.57.0,gcc版本4.8.2 20140120(红帽4.8.2-16)