C ++unordered_map有没有办法为元素预先分配内存,如果事先知道最大大小
c++ unordered_map is there a way to pre-allocate memory for elements if max size known in advance
看起来保留/重新哈希函数只预先分配存储桶的数量,而不是要插入的元素(键,vlaue)对的内存。
有没有办法我们也可以为元素预先分配内存,这样低延迟的应用程序就不需要在动态内存分配上浪费时间。
一种可能性是编写自己的分配器。如果您至少对表中可能出现的项目数量有一个公平的了解(因此您可以为所有项目预先分配空间),并且不关心从表中删除项目时重新使用项目的空间(因此您的簿记很简单),这将特别有效。
在这种情况下,您基本上可以为 N 个对象预先分配空间,并简单地跟踪要分配的下一个项目的位置。分配对象包括简单地返回地址和递增指针,如return *next++;
当然,这并不能真正消除动态分配 - 它只是使它足够便宜,以至于您可能不再关心它(并且由于它是作为模板参数提供的,因此很有可能将其内联扩展,因此您甚至不会在此过程中获得函数调用的开销。
即使你不能忍受分配器的限制,固定大小对象的通用分配器通常仍然(至少在某种程度上)比可变大小对象的分配器快。它仍然不会消除动态分配,但它可能会在速度上提供足够的改进,从而更好地满足您的目的。
相关文章:
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 如果不分配内存,我如何能够为变量创建和分配值?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 如果操作系统未清除内存泄漏,则在程序完成后内存泄漏是否仍然存在?
- 如果没有指针,如何识别堆栈上的内存?
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 如果内存不足,抛出Bad_alloc异常
- 如果内存有限,将自动使用swap