有没有办法找到分配给地图的内存大小?

fre*_*orn 6 c++ dictionary

有没有找到在c ++中分配给地图的内存量/大小的方法?有一个函数可以找到地图的大小,即地图中的条目数,但是存在任何这种方法.我有一个地图(字符串,字符串).sizeof()总是给我48的大小.这是什么原因?谢谢 :)

Dam*_*mon 5

没有简单的方法,但是如果您真的必须知道(尽管...为什么会这样?),那么您可以找到答案。

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

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

如果编写一个分配器,该分配器在分配/取消分配时递增/递减整数,则您会知道已动态分配了多少内存。此外,的值sizeof非常精确。


Zet*_*eta 4

不,那里没有。但是,对于支持.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;
}
Run Code Online (Sandbox Code Playgroud)

如果你想知道分配的内存,你可以使用.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;
}
Run Code Online (Sandbox Code Playgroud)

  • @user1291063:不客气。请注意,这仍然会比实际使用的内存少一点,因为它不计算指针的内存,所以它仍然只是一个估计值。但是,您可以按照 Damon 的建议使用自定义分配器,这将使您能够跟踪所有内存。 (2认同)