我想将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
发布于 2010-03-27 14:11:46
使用哈希表。unordered_map可能是不合适的,因为它允许每个对象单独分配,并使用“封闭寻址”与存储桶,而不是一个扁平的内存块。
有关您应该考虑的结构类型的描述,请参阅http://en.wikipedia.org/wiki/Hash_table#Open_addressing。实现一个具有恒定访问时间和恒定插入时间的关联容器并不太难。
但是,对删除的支持可能有点混乱,您将需要在哈希表中分配相当多的空闲空间,可能是实际使用的两倍,以保持地址空间的整洁。
发布于 2010-03-27 14:05:50
这对于map来说不是必需的,就像vector需要的那样。因为map在内部是以树的形式实现的,所以插入很便宜(不需要移动整个块)。另一方面,对于一个vector,如果插入操作超过了当前保留的边界,则需要移动所有先前分配的元素。
也就是说,如果分配性能对您来说非常重要,您可以编写一个自定义分配器,比如说,从预先分配的缓冲区进行分配。如果您正确地实现了它,它将比map使用的默认new更快。然而,我怀疑你一定要走到这一步。
发布于 2010-03-27 14:11:18
std::map没有提供任何内置支持来实现这一点。但是,如果元素的数量足够少,那么您可以创建成对的std::vector并使用vector::reserve方法来预留所需的空间。
https://stackoverflow.com/questions/2528317
复制相似问题