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

Pra*_*ari 6 c++ memory stl allocation map

我想在地图中插入n个元素,其中n是提前知道的.我不想在每次插入时分配内存.我想在开始时分配所有内存.有没有办法做到这一点?如果是这样,怎么样?写一些内存分配器会有帮助吗?

我运行了GMan的代码并获得了以下输出.通过调用"new"打印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

Eli*_*sky 1

这对于 a 来说不是必需的,map而对于vector. 由于map内部是作为树实现的,因此插入很便宜(您不需要移动整个块)。另一方面,对于vector超出当前保留边界的插入,需要移动所有先前分配的元素。

也就是说,如果分配性能对您来说非常重要,您可以编写一个自定义分配器,例如从预分配的缓冲区进行分配。如果你正确地实现了这一点,它将newmap. 然而,我怀疑你是否必须走这么远。