我需要在C ++

时间:2018-02-16 18:45:45

标签: c++ bit-masks

可跳过的上下文:我有一个模拟循环(using fixed update but variable rendering pattern),它根据用户输入和/或文件实例化生成的entities个类来自数百万个组件(container state modifying pattern)的数据库中的配置。

我已经实现了一个自动 ...推导出的系统(某种逻辑单元格/数学我不知道名字)并在用户输入时应用所需的组件/ config 忽略了其中一个选项需要其他组件这一事实。

怎么样?许多组件是复杂的公式或模糊逻辑(门?)或其他复杂的科学推理,编码方式可以操作我的模拟结构,其对象,环境,因此有时一个组件依赖于另一个组件,我需要'演绎算法/系统'能够将这种依赖传递给类构造函数。

我在决定存储这些“知识片段”的方式中使用了最大粒度,因为考虑到模拟的大小和计算强度以及单个实例的数量,我真的不能浪费任何内存,但现在我正在运行单个实例的问题需要成千上万,有时成千上万的组件,我需要实例的“创建 - 映射”既保存又仍然绑定为私有成员,所以我可以:第一 - 知道我的推论在哪里领导构造函数实例,也许能够使用memoization来减少构建时间;第二步 - 在模拟期间实施对实时实例的更改注释¹。

  

我认为我需要什么:我需要一个可能无限或至少很长的时间   位掩码,所以我可以更快地迭代创建并让最终   我为将来记录的动态构造对象的组件树   使用

     

我不知道的可能方法会起作用: 1st - 手动   并顺序存储每个RAM单元中位标志的值,   使用RAM晶圆作为我的位掩码。第二 - 将地图细分为   已知大小的较小位掩码(很难,因为最终的数量   组件是未知的,直到创建完成并解耦   如果没有,推论是可能的   重构整个系统)。 3 - 找出一种制作方法   无限位掩码,或使用一些真正实现的库   长整数(5.12e + 11或更大)。

我的代码是用C ++编写的,我的渲染和计算内核都是Vulkan。

我的客观问题: 如何实现一个任意长的位掩码,即内存和计算效率?

如果我被允许提出奖金问题,假设我没有架构(软件和硬件)约束,是实现这种位掩码的最有效方法是什么?

¹我无法在模拟过程中浏览对象的树,我也无法暂停模拟并等待在注入修改之前完成浏览,我需要知道并能够对任意进行任意更改模拟框架以预先安排的方式和实时的方式。

1 个答案:

答案 0 :(得分:2)

  

实现这种位掩码的最有效方法是什么

std::vector<bool>放在那里并进行个人资料。如果/当您发现自己花费大量时间处理该向量时,请进一步阅读。

没有最有效的方法,这完全取决于你的代码对这些位的确切作用。

一种标准方法是保持整数的连续向量,并将它们视为位向量。例如,Windows上的std::vector<bool>使用32位值,每个值保持32个bool。

然而,std :: vector的API太笼统了。如果你的向量具有大多数0-s或大多数1-s,你将能够比std::vector<bool>快得多地执行许多操作(获取值,找到第一个/下一个/前一个0/1)。

另外,根据您的访问模式,您可能需要更小或更大的元素。如果您决定使用大型SIMD类型,例如__m128i__m256i,请不要忘记它们的对齐方式。