我目前正試圖在即時(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