Std::map用于小型稀疏集合
std::map for small sparse collections
给定一个结构体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个。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 用于循环访问多个集合的数据结构
- 一个类用于集合和字典 (map)
- 是否有用于存储离散间隔的集合
- 除了集合之外,模板还可以用于什么
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 用于访问集合c++的排序子集的数据结构
- 是否可以将.NET并发集合用于X64通信的过程间X32
- 以前这样做过吗?(Monad视图包装用于链操作的c++集合/类型)
- C++中的一个reduce函数(用于许多集合并集)
- 相当于 python 的 set.pop() 用于C++的无序集合
- 当使用std::set_intersection时,该集合用于将值复制到目标集合中
- 一个有索引的集合(用于在向量中有效地删除)
- Lua vs嵌入式Lisp和潜在的其他候选.用于基于集合的数据处理
- 用于在C++中返回集合的接口
- Set_intersection用于两种不同类型的集合
- boost是否有比STL更简单的用于集合操作的数据类型?
- 用于存储大量索引的数据结构,每个索引指向一个集合
- Std::map用于小型稀疏集合