我正在使用std :: map,并且无法理解它消耗了多少内存。
我有以下地图定义:
generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH"
(在将元素插入地图之前或之后无效) 我正在那个
CKey {
long x;
int y;
int z;
bool operator<(const CKey& l) const;
};
CValue {
int data1;
int data2;
}
std::map<CKey, CValue> map;
std::cout << "sizeof() = " << sizeof(map) << " Max #Elms = " << map.max_size();
答案 0 :(得分:4)
在C和C ++中,sizeof
运算符会告诉您该类实例占用的 stack 空间的字节数。
与其他标准容器(std::array
除外)一样,map
在使用默认分配器时在堆上分配其元素。这意味着它的静态大小(即sizeof
返回的内容)不依赖于map
中的元素数。
您可以使用map
成员函数找出size()
中有多少元素。另一方面,max_size()
成员函数告诉你理论上可以存储map
多少元素 - 在64位系统上,你几乎可以肯定会受到你的RAM量的限制。系统而不是max_size()
返回的内容。
实际上计算map
的总内存使用量(堆栈和堆)并不是一件容易的事情:在C ++ 17中你可以做类似的事情
sizeof(map) + map.size() * sizeof(typename map::node_type);
粗略猜测,但实际上它取决于标准库的实现细节。
答案 1 :(得分:1)
std::map
定义了以下方法
返回由于系统或库实现限制而容器能够容纳的最大元素数
返回容器中元素的数量
因此,以下计算将为您提供字节中地图实际大小的良好近似(假设Key和Value类型是基元类型的结构):
sizeof(mymap) + mymap.size() * (sizeof(decltype(mymap)::key_type) + sizeof(decltype(mymap)::mapped_type))