如何完全管理像map这样的std容器的堆内存分配
How to completely manage heap memory allocation of std containers like map?
我对使用多个std映射<;感兴趣;int,int>;并且我希望它们都从一个公共内存池中分配元素。根据我到目前为止所读到的内容,我可以使用自定义分配器(如Boost pool_alloc)来实现这一点。
我的问题是,尽管使用了类似Boost pool_alloc的东西来管理元素本身的分配,但std-map是否仍会使用少量堆内存作为某种形式的容器开销,而Boost pool_alloc不会对此进行管理?我在想一些关于use std映射本身的指向元素的指针?
短版本
地图类型,例如:
typedef std::map<
int,
int,
less<int>,
boost::pool_allocator<pair<const int, int> >
>
AMapType;
将使用boost::pool_allocators在增长过程中完成所需的所有分配。一些初始结构可能是在堆栈上创建的。具体的结构是多少和什么取决于实现。
分配器重新绑定
通过使用allocator::rebind
可以实现上述功能
所有符合std::allocater的分配器(如boost::pool_allocater)都提供了一个形式为的重新绑定模板结构
template<class U> struct rebind{
typedef AllocatorType<U> other;
};
这可以用于为不同类型获得相同类型的分配器:
typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;
gcc std::映射内部结构
g++std::map实现(我检查了4.7.3和4.1.1)完全由单个节点类型构建而成。这包括rbTree结构所需的键值对、指针和颜色位。为了分配它,它使用用户提供的分配器的rebind结构定义了一个Node分配器。随着地图的增长,这将用于它所做的所有分配。每个新节点都在一个分配中进行分配。
标准
我查看了C++11标准,没有找到任何具体说明应该如何分配这种结构的内容。要么我没有找到正确的部分,要么没有指定。不过,不使用用户给定的分配器类型似乎有点毫无意义。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我可以重新分配/覆盖std::字符串吗
- 为什么 std::equal_to会导致动态分配?
- 使 std::vector 分配对齐内存的现代方法
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- C++ 使用枚举类对象分配 std::map 值
- std::元组分配和复制/移动异常保证
- 使用 std::vector 在类中分配索引
- vector是否为std::移动的对象连续分配内存
- std::initializer_list 堆是否分配内存?
- std::p air 会破坏其动态分配的对象吗?
- 在std::线程中使用已分配的结构数据
- 无法使用"std::make_shared"分配指针
- std矢量内存分配linux与windows编译器
- 如何为包含最多N个元素的std::multiset调用最大数量分配
- 如何在 C++11 的内存池中分配 std::map 的内部RB_tree节点?
- 如何使用 std::vector 防止内存重新分配
- 使用 std::map 的递归堆栈分配如何工作?
- 我可以使用std ::分配的分配的原始数组