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

时间:2015-07-20 18:19:59

标签: c++ performance types bit-manipulation

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

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

+----------+----------+----------+----------+----------+
| Object 1 | Object 2 | Object 3 | Object 4 | Object 5 |
+----------+----------+----------+----------+----------+
|   2 4 5  |   1 3 5  |   1 2    | 1   5    |   1 2 4  |
+----------+----------+----------+----------+----------+

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

由于这在代码中发生了数百万次,我需要一种快速获取对象子集与之兼容的对象列表的方法。我想过使用一系列的位,每个位代表一个数组的一个条目,如果与它关联的对象与数组的第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个对象时,必须比较数千个对象,这会浪费内存并且可能会很慢) )。
  • 使用动态数组:我认为动态分配可能会很昂贵,尽管我没有太多考虑过。此外,我不知道是否迭代两个数组并且每个入口的速度和AND一个相同大小的对象一样快,但我怀疑没有。

这个问题有效吗?如果事实证明更快,我会对这种检查“兼容性”的方法感到满意。

1 个答案:

答案 0 :(得分:0)

根据CoryKramer在评论中的建议,我选择了boost::dynamic_bitset,这就是诀窍。