C++ 对象的大小取决于运行时信息

C++ 对象的大小取决于运行时信息,c++,performance,types,bit-manipulation,C++,Performance,Types,Bit Manipulation,我想测试存储在数组中的不同对象子组如果组合在一起是否满足特定条件,并且我知道如果与其他对象组合在一起,某些对象无法满足该条件 一个明确的例子。第二行表示哪些其他对象与给定对象兼容(即1与2、4和5兼容;2与1、3和5兼容…) 我想删除不必要的比较,因为它们会大大加快代码的速度。也就是说,当检查1和2在一起是否可以满足与其他内容分组时的条件时,我可以避免检查3(因为与3分组时1不能满足它)和4(因为与4分组时2不能满足它) 由于这种情况在代码中发生了数百万次,因此我需要一种快速的方法来获取对象子集

我想测试存储在数组中的不同对象子组如果组合在一起是否满足特定条件,并且我知道如果与其他对象组合在一起,某些对象无法满足该条件

一个明确的例子。第二行表示哪些其他对象与给定对象兼容(即1与2、4和5兼容;2与1、3和5兼容…)

我想删除不必要的比较,因为它们会大大加快代码的速度。也就是说,当检查1和2在一起是否可以满足与其他内容分组时的条件时,我可以避免检查3(因为与3分组时1不能满足它)和4(因为与4分组时2不能满足它)

由于这种情况在代码中发生了数百万次,因此我需要一种快速的方法来获取对象子集与之兼容的对象列表。我考虑使用一系列位,每个位代表数组的一个条目,如果与之关联的对象与数组第n条目的对象兼容,则设置第n位

因此,如果我们设想使用5位,我们将得到:

+----------+----------+----------+----------+----------+
| Object 1 | Object 2 | Object 3 | Object 4 | Object 5 |
+----------+----------+----------+----------+----------+
|  01011   |  10101   |  11000   |  10001   |  11010   |
+----------+----------+----------+----------+----------+
要查看值得测试1-2的对象,可以对两组位执行AND: 01011 & 10101 = 00001 也就是说,只应对第5个条目进行测试。 我这样做是因为我假设位运算比存储更复杂的对象(如向量)和进行它们的交集更快,占用的内存更少

问题是我不知道在编译时会有多少个对象(我最多可以有几百个)。那么,我可以用什么类型来表示这组位呢? 我能想到的黑客包括:

  • 使用大型类型(几十个uint64的结构):如果我只有几个对象(例如,只有8个对象时必须比较数千位),这将是一种内存浪费,并且可能会很慢
  • 使用动态数组:我认为动态分配可能会很昂贵,尽管我没有考虑太多。另外,我不知道遍历两个数组并遍历每个入口是否与遍历相同大小的对象一样快,但我怀疑不是这样
这个问题有没有有效的解决办法?如果这种检查“兼容性”的方法被证明更快的话,我会很乐意使用另一种替代方法。

正如在一篇评论中所建议的,我选择了,哪一种做了这个把戏。

正如在一篇评论中所建议的,我选择了,哪一种做了这个把戏。

?std::vector带有一些自定义(堆栈)分配器。我认为它不是一个实际的位集,但是
std::valarray
可以像使用位集一样使用,例如,它支持所有按位运算符。当调整大小时,它将被擦除,这与带有一些自定义(堆栈)分配器的
boost::dynamic_bitset
?std::vector不同。我认为它不是实际的位集,但
std::valarray
可以像使用位集一样使用-例如,它支持所有的位运算符。与
boost::dynamic_bitset
不同,它在调整大小时将被擦除。
+----------+----------+----------+----------+----------+
| Object 1 | Object 2 | Object 3 | Object 4 | Object 5 |
+----------+----------+----------+----------+----------+
|  01011   |  10101   |  11000   |  10001   |  11010   |
+----------+----------+----------+----------+----------+