c++ - std::map 用于小型稀疏集合

标签 c++ visual-studio-2010 visual-c++

给定一个结构 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/

相关文章:

visual-studio-2010 - Visual Studio 2010 中的 openCV 2.2 createButton LNK 2019 错误

c++ - 自动类型推导没有按预期工作

c++ - 数据 GridView 创建

c++ - 错误 C2504 - 基类未定义

c - 为什么这段代码不能编译?

c++ - 尝试使用 std::function 实例化模板时出现错误 C2371

c++ - 派生类 : using Base class member in initializer list

c++ - C/C++ 动态或静态内存分配?

c++ - 为什么我们在 C++ 中需要 extern "C"{ #include <foo.h> }?

c++ - 如何在 Makefile 中向 1 头文件添加引用