我对使用多个std map< int,int>感兴趣我希望他们所有人都从公共内存池中分配元素。从我到目前为止所读到的,我可以使用自定义分配器,如Boost pool_alloc来实现这一点。
我的问题是,尽管使用像Boost pool_alloc这样的东西来管理元素本身的分配,std map仍会使用少量的堆内存作为某种形式的容器开销,而不是由boost pool_alloc管理?我正在考虑使用std地图本身的指向元素的方法吗?
答案 0 :(得分:3)
简短版
地图类型,例如:
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)都以以下形式提供重新绑定模板结构:
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标准,但找不到任何指定如何分配这种结构的内容。要么我找不到合适的部分,要么没有指定。不使用给定分配器类型的用户似乎有点无意义。