C++ 如何完全管理像map这样的std容器的堆内存分配?

C++ 如何完全管理像map这样的std容器的堆内存分配?,c++,map,heap,std,memory-pool,C++,Map,Heap,Std,Memory Pool,我对使用多个std映射感兴趣,我希望它们都能从一个公共内存池分配元素。从我到目前为止所读到的内容来看,我可以使用自定义分配器(如boostpool_alloc)来实现这一点 我的问题是,尽管使用类似于boostpool_-alloc的东西来管理元素本身的分配,std-map是否仍会使用少量堆内存作为某种形式的容器开销,而boostpool_-alloc不会管理这些开销?我在想一些关于使用std映射本身的指向元素的指针的事情?短版本 映射类型,例如: typedef std::map<

我对使用多个std映射感兴趣,我希望它们都能从一个公共内存池分配元素。从我到目前为止所读到的内容来看,我可以使用自定义分配器(如boostpool_alloc)来实现这一点


我的问题是,尽管使用类似于boostpool_-alloc的东西来管理元素本身的分配,std-map是否仍会使用少量堆内存作为某种形式的容器开销,而boostpool_-alloc不会管理这些开销?我在想一些关于使用std映射本身的指向元素的指针的事情?

短版本

映射类型,例如:

typedef std::map<
    int,
    int,
    less<int>,
    boost::pool_allocator<pair<const int, int> >
    > 
    AMapType;
这可用于为不同类型获取相同类型的分配器:

typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;
typedef分配器其他分配器type::rebind::other;
gcc标准::映射内部结构

g++std::map实现(我检查了4.7.3和4.1.1)完全是基于单个节点类型构建的。这包括rbTree结构所需的键值对、指针和颜色位。为了分配这个节点,它使用用户提供的分配器中的rebind结构定义了一个节点分配器。这将用于它在地图增长时执行的所有分配。每个新节点在一次分配中得到分配

标准


我检查了C++11标准,没有找到任何指定如何分配这种结构的内容。要么我没有找到正确的部分,要么它没有指定。不过,不使用用户指定的分配器类型似乎有点毫无意义。

您是否要求使用包含指针的容器?很抱歉问一下,但我到目前为止还不明白…@Stefan:不,不是包含指针的容器。鉴于自定义分配器将负责元素本身的分配,我要问的是,定制分配器是否也会覆盖std::map的所有容器内存开销。我希望这有助于澄清我的问题。理解。不可以。特定分配器负责为特定元素而不是容器本身在堆上分配空间。如果你想改变它,你需要为你的特定容器重载操作符new/delete。这是否意味着,除了节点元素(由重新绑定生成)本身之外,std::map不会创建其他分配?因此,我做了您所做的,但我使用了
boost::pool\u分配器
。这起作用了。这是如何工作的?@JHBonarius容器实现可能从未实际使用分配器作为其原始类型,并且总是首先将其重新绑定到其他类型。在这种情况下,模板参数中几乎任何类型都可以工作。
typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;