奇怪的sizeof(std :: map)

Boo*_*oom 0 c++ stdmap

我正在使用std :: map,无法理解它消耗了多少内存。

我有以下地图定义:

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();
Run Code Online (Sandbox Code Playgroud)

(在地图中插入元素之前或之后都没有问题)

sizeof() = 48
Max_Size = 329406144173384850
Run Code Online (Sandbox Code Playgroud)
  1. 如果sizeof(map)= 48,它如何包含329406144173384850个元素?
  2. 地图是否将储存在其他内存中(堆?)

Tri*_*dle 5

在C和C ++中,sizeof运算符告诉您该类实例将占用多少字节的堆栈空间。

与其他标准容器(除外std::array)一样,在使用默认分配器时map堆上分配其元素。这意味着其静态大小(即sizeof返回的内容)不取决于中的元素数量map

您可以map使用size()成员函数找出a中有多少个元素。max_size()另一方面,成员函数告诉您map理论上可以存储多少个元素-在64位系统上,几乎可以肯定,您将受到系统上RAM数量的限制,而不是max_size()返回的内容。

实际计算a的总内存使用量(堆栈和堆)map不是一件容易的事:在C ++ 17中,您可能可以执行以下操作

sizeof(map) + map.size() * sizeof(typename map::node_type);
Run Code Online (Sandbox Code Playgroud)

给您一个大概的猜测,但这实际上取决于标准库的实现细节。