如果事先知道最大大小,c ++ unordered_map有一种为元素预分配内存的方法

Med*_*ine 6 c++ memory-management stl unordered-map hashtable

看起来像reserve/rehash函数只预先分配桶的数量,而不是要插入的元素(key,vlaue)对的内存.

有没有办法我们可以预先为元素分配内存,所以低延迟的应用程序不需要浪费时间在动态内存分配上.

Jer*_*fin 3

一种可能性是编写您自己的分配器。如果您至少清楚地知道表中可能有多少项目(这样您就可以为所有项目预先分配空间)并且不关心为项目重新使用空间,那么这会特别有效它们已从表中删除(因此您的记账很简单)。

在这种情况下,您基本上可以为 N 个对象预先分配空间,并简单地跟踪下一个要分配的项目的位置。分配对象只需要返回地址并递增指针,如下所示return *next++;

当然,这并没有真正消除动态分配——它只是使它足够便宜,以至于您可能不再关心它(并且由于它是作为模板参数提供的,因此很有可能将其内联扩展,因此您甚至不会获得进程中函数调用的开销。

即使您无法忍受分配器的严格限制,用于固定大小对象的通用分配器通常仍然(至少在某种程度上)比用于可变大小对象的分配器更快。它仍然不会消除动态分配,但它可能会在速度上提供足够的改进,以便更好地满足您的目的。