C++ 清空std::无序映射内存后减少内存占用
假设我有一个C++ 清空std::无序映射内存后减少内存占用,c++,memory-management,unordered-map,C++,Memory Management,Unordered Map,假设我有一个std::unordered_map对象,我在其中添加了一些元素,然后将它们删除。除了构造一个新对象来替换旧对象之外,是否有一种方法可以强制减少映射对象的内存占用,类似于std::vector::shrink_to_fit()?由于节点是根据需要分配和删除的,因此可以减少的唯一内存是存储桶列表所使用的内存。这可以通过调用unordered_map上的rehash(0)(该参数是要使用的最小存储桶数;根据存储在映射中的内容数量和映射的max_load_factor())来实现。这可能是
std::unordered_map
对象,我在其中添加了一些元素,然后将它们删除。除了构造一个新对象来替换旧对象之外,是否有一种方法可以强制减少映射对象的内存占用,类似于std::vector::shrink_to_fit()
?由于节点是根据需要分配和删除的,因此可以减少的唯一内存是存储桶列表所使用的内存。这可以通过调用unordered_map
上的rehash(0)
(该参数是要使用的最小存储桶数;根据存储在映射中的内容数量和映射的max_load_factor()
)来实现。这可能是一个耗时的操作,具体取决于同一个bucket中有多少节点
创建新映射的备选方案将更慢,因为存储在新映射中的内容需要为其分配存储空间,在所有插入过程中可能会发生多次重新存储(取决于映射的大小),并且旧映射使用的节点将需要释放。通过调用
extract
从旧映射中删除节点,然后调用insert
将节点添加到新映射中,可以重用节点,但是在新映射中仍然可以进行重新分级。我不知道为此编写分配器是否过份。缩小哈希映射需要重新分级,因此构建新哈希映射可能同样快。