我对使用多个 std map<int,int> 很感兴趣,我希望它们都从一个公共内存池中分配元素。从我目前所读的内容来看,我可以使用自定义分配器(例如 Boost pool_alloc)来实现这一点。
我的问题是,尽管使用 Boost pool_alloc 之类的东西来管理元素本身的分配,std map 是否仍会使用少量堆内存作为某种形式的容器开销,而不是由 boost pool_alloc 管理?关于使用 std 映射本身,我正在考虑指向元素的指针?
我对使用多个 std map<int,int> 很感兴趣,我希望它们都从一个公共内存池中分配元素。从我目前所读的内容来看,我可以使用自定义分配器(例如 Boost pool_alloc)来实现这一点。
我的问题是,尽管使用 Boost pool_alloc 之类的东西来管理元素本身的分配,std map 是否仍会使用少量堆内存作为某种形式的容器开销,而不是由 boost pool_alloc 管理?关于使用 std 映射本身,我正在考虑指向元素的指针?
短版
地图类型,例如:
typedef std::map<
int,
int,
less<int>,
boost::pool_allocator<pair<const int, int> >
>
AMapType;
将使用 boost::pool_allocators 完成它需要的所有分配。一些初始结构很可能是在堆栈上创建的。多少以及确切的结构将取决于实现。
分配器重新绑定
以上可以通过使用allocator::rebind
所有符合 std::allocator 的分配器(例如 boost::pool_allocator)都提供了一个 rebind 模板结构,格式如下:
template<class U> struct rebind{
typedef AllocatorType<U> other;
};
这可用于为不同类型获取相同类型的分配器:
typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;
gcc std::map 内部结构
g++ std::map 实现(我检查了 4.7.3 和 4.1.1)纯粹是由单个节点类型构建的。这包括键值对以及 rbTree 结构所需的指针和颜色位。为了分配它,它使用来自用户提供的分配器的重新绑定结构定义了一个节点分配器。这用于随着地图的增长而进行的所有分配。每个新节点都在一次分配中分配。
标准
我检查了 C++11 标准,但找不到任何指定应该如何分配这种结构的东西。要么我没有找到正确的部分,要么没有指定。不过,不使用给定分配器类型的用户似乎有点毫无意义。