Std::map用于小型稀疏集合

std::map for small sparse collections

本文关键字:集合 用于 map Std 小型      更新时间:2023-10-16

给定一个结构体MyData,其中存在许多实例(我说最多几百万),对于每个实例,我需要存储一个成员,该成员可能包含多达8个键的值。键将始终是int范围内的0-7,值将始终是浮点数的3D点(我们称之为Point3)。

最大包含:

Key | Value  
-------------
0   | [x,y,z]  
1   | [x,y,z]  
2   | [x,y,z]
3   | [x,y,z]
4   | [x,y,z]
5   | [x,y,z]
6   | [x,y,z]
7   | [x,y,z]

然而,在99.9%的情况下,它将包含0或1个键值对,例如:

Key | Value
-------------
1   | [x,y,z]  

我如何有效地确定存储空或单值std::map<int, Point3>的内存开销,与始终存储8个Point3(每个浮点数4个字节* 3个值* 8个插槽= 96个字节)和单个BYTE的数组相比,插槽包含有意义的值?

一般来说,我的问题是空的或几乎空的std::map 的内存开销是什么?

映射的内存开销并不那么糟糕。通常每个节点只有几个单词。在"不进行过早优化"的规则下,从地图开始肯定是可行的。

也就是说,当您进行优化时,映射将在要替换的数据结构列表中名列前茅。但在这一点上,你可以描述你实际使用的所有不同的操作。键和/或值多久改变一次?这是优化之前需要知道的关键信息。

[编辑]如果我建议一个结构体,它将是std::pair<int, Point3D>的向量。原因是这可能提供对齐友好的16字节对象。我不会费心对键进行排序,因为这只对具有多个键/值对的0.1%节点有用。

看看这篇博文。对不同STL容器(包括std::map)和不同平台/编译器的内存使用情况进行了非常全面的分析。

在Visual Studio 2010 (Visual c++ 10)自带的64位STL中:


map为映射对象本身使用32字节,则每个映射节点为26字节比所包含对象的大小大的字节(可能是32字节)在考虑对齐和浪费之后)。地图的数量一个地图所需的节点比地图的大小多1个。