有什么方法可以找到分配给映射的内存大小?

新手上路,请多包涵

有什么方法可以在 c++ 中找到分配给地图的内存量/大小?有一个函数可以找到映射的大小,即映射中的条目数,但是内存有没有这样的方法。我有一张地图(字符串,字符串)。 sizeof() 总是给我 48 的大小。为什么会这样?谢谢 :)

原文由 freeborn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 287
2 个回答

不,那里没有。但是,对于支持 .size 方法的类,您可以实现类似的功能,例如字符串或标准容器:

 template <class Key, class Value>
unsigned long mapSize(const std::map<Key,Value> &map){
    unsigned long size = sizeof(map);
    for(typename std::map<Key,Value>::const_iterator it = map.begin(); it != map.end(); ++it){
        size += it->first.size();
        size += it->second.size();
    }
    return size;
}

如果您想知道分配的内存,您可以使用 .capacity

 template <class Key, class Value>
unsigned long mapCapacity(const std::map<Key,Value> &map){
    unsigned long cap = sizeof(map);
    for(typename std::map<Key,Value>::const_iterator it = map.begin(); it != map.end(); ++it){
        cap += it->first.capacity();
        cap += it->second.capacity();
    }
    return cap;
}

原文由 Zeta 发布,翻译遵循 CC BY-SA 3.0 许可协议

没有 简单 的方法,但如果你真的必须知道(虽然……你为什么会?),那么你可以找到。

默认情况下,所有标准库容器都使用“默认分配器”进行分配,它只不过是一个结构/类,在 newdelete 周围有一对包装函数(它们本身是,在内部,只不过是 mallocfree 的包装器,在许多编译器上进行了一些对齐和类型转换)。

如果您出于某种原因对默认分配器不满意,您可以为容器模板提供自定义分配器,它会无缝地使用该分配器。

如果您编写一个在分配/解除分配时递增/递减整数的分配器,您就会知道动态分配了多少内存。加上 sizeof 的值非常精确。

原文由 Damon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题