gpt4 book ai didi

c++ - 如何完全管理 std 容器(如 map)的堆内存分配?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:20 26 4
gpt4 key购买 nike

我对使用多个 std map 很感兴趣,我希望它们都从一个公共(public)内存池中分配元素。根据我目前所读的内容,我可以使用自定义分配器(例如 Boost pool_alloc)来实现这一点。

我的问题是,尽管使用 Boost pool_alloc 之类的东西来管理元素本身的分配,std map 是否仍会使用少量堆内存作为某种形式的容器开销,boost pool_alloc 不会管理这些开销?我在考虑关于使用标准映射本身的指向元素的指针?

最佳答案

精简版

map 类型,例如:

typedef std::map<
int,
int,
less<int>,
boost::pool_allocator<pair<const int, int> >
>
AMapType;

将使用 boost::pool_allocators 完成它需要的所有分配。一些初始结构很可能是在堆栈上创建的。多少以及具体的结构取决于具体实现。

分配器重新绑定(bind)

以上可以通过使用 allocator::rebind

所有 std::allocator 一致性分配器(例如 boost::pool_allocator)都提供一个重新绑定(bind)模板结构,形式如下:

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 结构所需的键值对和指针和颜色位。为了分配它,它使用来自用户提供的分配器的重新绑定(bind)结构定义了一个节点分配器。这用于它在 map 增长时所做的所有分配。每个新节点都在一次分配中分配。

标准

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

关于c++ - 如何完全管理 std 容器(如 map)的堆内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17773171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com