c++ - 使用 std::map 的内存爆炸

标签 c++ visual-studio-2010 dictionary memory stl

我在 C++ 中为 VS10 使用 std::map 时遇到问题。 当我运行这段简单的代码时

std::map<int,int>myMap;
for(size_t i=0;i<1000000;i++){
     myMap[i]=i;
}

我的内存爆炸到 256Mo,这对我来说似乎很奇怪。 如果我使用

std::vector<int>myVector(1000000);

我按预期获得了 4Mo。

如果有人能解释这个现象。 谢谢

最佳答案

std::map 很可能实现为红黑树,这意味着以下字段,假设 x64:

  1. 红色或黑色(1 个 bool 值,但由于填充,实际上是 4 个字节)
  2. 父级(8 字节指针)
  3. 左 child ,右 child (两个 8 字节指针)
  4. 根对象(8 字节指针)
  5. 数据键(4 字节为 int)
  6. 数据值(int 为 4 个字节)

这会让您获得最多 44 个字节的每个项目或 44 兆字节的内存。也不同于 std::vector 的情况,其中每一个都是独立的对象,它添加了大约 24 字节的额外数据。这使我们达到 68 兆字节。这仍然是您所看到的四分之一,但至少您可以看出为什么尺寸存在巨大差异。

关于c++ - 使用 std::map 的内存爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36729146/

相关文章:

c++ - SDL 导致 Undefined symbols : "_main", referenced from : start in crt1. 10.5.o

visual-studio-2010 - 共享点 2010 : edit a view programmatically

visual-studio-2010 - OpenCV 构建中的可选库提供什么?

visual-studio-2010 - Visual Studio 2010 Professional 有序列图吗?

Python 用 'numpy.ndarray' 创建一个字典

xcode - Xcode 7 Beta 5 中的 String' 无法转换为 'StringLiteralConvertible'

python - 提取具有多个值的 : Python dictionary, 键

c++ - 遍历链表的列表

c++ - 尝试使用欧拉定理打印前 5 个完美数字

c++ - 除法函数返回错误值