我目前正试图在即时(JIT)编译器中实现各种算法。许多算法在位图上运行,通常称为位集。我应该使用哪种bitset实现以实现最佳性能?
在C++中有多种实现bitset的方法。作为一名真正的C++开发人员,我宁愿使用STL中的某些东西。最重要的方面是性能。我不一定需要动态调整大小的位集。
正如我所见,有三种可能的选择。
I.一种选择是使用std::vector<bool>
,它已经针对空间进行了优化。这也表明数据不必在内存中连续。我想这可能会降低性能。另一方面,每个bool值有一位可以提高速度,因为它对缓存非常友好。
二,另一种选择是改为使用std::vector<char>
。它保证数据在内存中是连续的,访问单个元素更容易。然而,使用这个选项感觉很奇怪,因为它并不打算成为一个bitset。
三,第三种选择是使用实际的std::bitset
。这不是动态调整大小的事实并不重要。
我应该选择哪一个以获得最佳性能?
基准! [相关](http://www.youtube.com/watch?v=wg4trPZFUwc) – 2012-07-29 20:01:24
还有[Boost.Dynamic Bitset](http://www.boost.org/doc/libs/1_50_0/libs/) dynamic_bitset/dynamic_bitset.html)来考虑。但是认真地说,如果不知道使用模式,就无法确定哪种性能具有最佳性能。例如:如果您的收藏很小并且经常访问'vector',则可能会让您更快地访问该位集,因为无需进行位移/遮罩。但是,当访问次数较少/较大时,由于内存占用量较大导致缓存未命中数量增加可能会导致这种好处。 –
Grizzly
2012-07-29 20:18:28
冒着指出可能很明显的事情的风险:std :: bitset被分配在堆栈上,因此在大多数情况下最大尺寸受到限制。但是,我不知道需要存储的数据量。 – identity 2012-07-29 20:25:55