【问题标题】:c++ unordered_map is there a way to pre-allocate memory for elements if max size known in advancec++ unordered_map 如果事先知道最大大小,有没有办法为元素预分配内存
【发布时间】:2013-10-30 16:14:50
【问题描述】:

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

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

【问题讨论】:

  • 您可以设置桶的大小和桶的数量将成为地图的大小
  • 我已经测试了reserve 在其构造函数中使用具有副作用的类型。看起来它确实没有为键或值保留内存。 ideone.com/yH746X
  • @polkovnikov.ph 我同意它只为存储桶保留空间,而不是为键和值保留空间
  • @aaronman 如何设置存储桶大小?也很难说每个桶中最终会有多少元素

标签: c++ memory-management stl hashtable unordered-map


【解决方案1】:

一种可能性是编写自己的分配器。如果您至少对表中可能有多少项目有一个大致的了解(因此您可以为所有项目预先分配空间)并且不关心重复使用项目的空间,这可能会特别有效它们已从表中移除(因此您的簿记很简单)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2015-06-15
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多