首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有固定插入次数的Map的内存分配

具有固定插入次数的Map的内存分配
EN

Stack Overflow用户
提问于 2010-03-27 13:59:48
回答 3查看 4.7K关注 0票数 6

我想将n个元素插入到一个映射中,其中n是预先已知的。我不希望在每次插入时都分配内存。我希望所有的内存分配都在一开始。有没有办法做到这一点?如果是这样的话,是怎么做的?写一些内存分配器会有帮助吗?

我运行了GMan的代码,得到了以下输出。通过调用“GetMem”来打印新建,通过调用delete来打印FreeMem。size是请求的字节数,ptr是返回的指针。显然,在插入过程中正在进行分配/释放。这点你又怎么解释?

GetMem大小40,ptr 0x8420008

GetMem大小40,ptr 0x8420038

GetMem大小为120,ptr为0x8420068

GetMem大小为120,ptr为0x84200e8

FreeMem ptr 0x8420068

FreeMem ptr 0x8420038

FreeMem ptr 0x8420008

插入: 0,0

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

插入: 1,2

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

插入: 2,4

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

插入: 3,6

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

插入: 4,8

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

插入: 5,10

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

GetMem大小40,ptr 0x8420008

FreeMem ptr 0x8420008

FreeMem ptr 0x84200e8

St9bad_alloc

EN

回答 3

Stack Overflow用户

发布于 2010-03-27 14:11:46

使用哈希表。unordered_map可能是不合适的,因为它允许每个对象单独分配,并使用“封闭寻址”与存储桶,而不是一个扁平的内存块。

有关您应该考虑的结构类型的描述,请参阅http://en.wikipedia.org/wiki/Hash_table#Open_addressing。实现一个具有恒定访问时间和恒定插入时间的关联容器并不太难。

但是,对删除的支持可能有点混乱,您将需要在哈希表中分配相当多的空闲空间,可能是实际使用的两倍,以保持地址空间的整洁。

票数 2
EN

Stack Overflow用户

发布于 2010-03-27 14:05:50

这对于map来说不是必需的,就像vector需要的那样。因为map在内部是以树的形式实现的,所以插入很便宜(不需要移动整个块)。另一方面,对于一个vector,如果插入操作超过了当前保留的边界,则需要移动所有先前分配的元素。

也就是说,如果分配性能对您来说非常重要,您可以编写一个自定义分配器,比如说,从预先分配的缓冲区进行分配。如果您正确地实现了它,它将比map使用的默认new更快。然而,我怀疑你一定要走到这一步。

票数 1
EN

Stack Overflow用户

发布于 2010-03-27 14:11:18

std::map没有提供任何内置支持来实现这一点。但是,如果元素的数量足够少,那么您可以创建成对的std::vector并使用vector::reserve方法来预留所需的空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2528317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档