有没有找到在c ++中分配给地图的内存量/大小的方法?有一个函数可以找到地图的大小,即地图中的条目数,但是存在任何这种方法.我有一个地图(字符串,字符串).sizeof()总是给我48的大小.这是什么原因?谢谢 :)
没有简单的方法,但是如果您真的必须知道(尽管...为什么会这样?),那么您可以找到答案。
默认情况下,所有标准库容器都使用“默认分配器”进行分配,该分配器只不过是带有一对包装函数new和的结构/类delete(它们本身在内部比包装函数多一点,malloc并free带有一些对齐和在许多编译器上进行类型转换)。
如果由于某种原因对默认分配器不满意,可以为容器模板提供自定义分配器,它将无缝使用该分配器。
如果编写一个分配器,该分配器在分配/取消分配时递增/递减整数,则您会知道已动态分配了多少内存。此外,的值sizeof非常精确。
不,那里没有。但是,对于支持.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)