C ++提供bitset
来存储位。根据引用,该类模拟bool
元素的数组,但针对空间分配进行了优化。在哪种情况下,一个应该优先于另一个?
答案 0 :(得分:7)
正确的是进行测量。
尽管如此,正如我记得的那样,有关位集的文档总是说有点集不能保证是真正的位,它只是对编译器的推荐和位操作的方便语法。
在嵌入式系统编译器中,许多人使用真实的位集,因为在这种程序中使用位是必不可少的。
至于速度,相反更合理 - 通过索引处理数组更简单。使用位需要更多的数学运算,才能访问正确的字,然后访问正确的位。
答案 1 :(得分:1)
您需要对用例进行基准测试。
bitset<N>
的传统实现是使用每元素位和array<bool, N>
- 每元素字节,因此前者具有更高的变化以适合L1d..LLd,因此可能是对于关键大小的位掩码,速度更快,至少在执行串行访问时bitset<N>
做了更多的数学运算,所以在一些访问模式下(高度随机)可能会慢一些array<bool, N>
每个元素的争用会更少,因此性能将取决于访问模式。答案 2 :(得分:0)
我有同样的问题,所以我为搜索序列设定了基准。因为bitset没有迭代器,所以我不得不为bitset做一个“ std :: search”替代。
c-lang 8.0结果:
64 bits => bitset 1.2 times slower than array
128 bits => bitset 1.4 times slower than array
1024 bits => bitset 1.5 times slower than array
4096 bits => bitset 1.5 times slower than array
gcc 9.1结果:
64 bits => bitset 1.6 times faster than array
128 bits => bitset 1.5 times faster than array
1024 bits => bitset 1.4 times faster than array
4096 bits => bitset 1.4 times faster than array
总计意外结果。
可以在此处运行基准测试http://quick-bench.com/-er6qDrx0dPmJ0rGnJ9t3EpLoMM