给定一个结构 MyData
,其中存在许多实例(我会说最多数百万),对于每个实例,我需要存储一个成员,该成员可能包含最多 8 个键的值。 key 将始终是 int
范围0-7
,并且值将始终是 float 的 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
的数组相比(每个 float 4 个字节 * 3 个值 * 8 个槽 = 96 个字节)和一个 BYTE
哪些槽位包含有意义的值?
一般来说,我的问题是空的或几乎空的std::map
的内存开销是多少| ?
最佳答案
map 的内存开销并不那么糟糕。每个节点通常只有几个字。在“没有过早优化”的规则下,使用 map 开始肯定是可以的。
也就是说,当您进行优化时,映射将在要替换的数据结构列表中排在前列。但此时,您可以分析您实际使用的所有不同操作。键和/或值多久更改一次?这是优化前需要了解的重要信息。
[编辑]
如果我要建议一个结构,它将是 std::pair<int, Point3D>
的 vector .原因是这可能给出对齐友好的 16 字节对象。我不会费心对键进行排序,因为这仅对确实具有多个键/值对的 0.1% 节点有用。
关于c++ - std::map 用于小型稀疏集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30477654/