奇怪的sizeof(std :: map)

时间:2017-10-22 13:04:07

标签: c++ stdmap

我正在使用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();
  1. 如果sizeof(map)= 48,它如何包含329406144173384850元素?
  2. 地图是否保存在其他内存中(堆?)

2 个答案:

答案 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定义了以下方法

max_size()

  

返回由于系统或库实现限制而容器能够容纳的最大元素数

size()

  

返回容器中元素的数量

因此,以下计算将为您提供字节中地图实际大小的良好近似(假设Key和Value类型是基元类型的结构):

sizeof(mymap) + mymap.size() * (sizeof(decltype(mymap)::key_type) + sizeof(decltype(mymap)::mapped_type))