Dobry wybór zależy od tego, w jaki sposób zamierzasz używać bitów.
std::bitset<N>
jest stałym rozmiarze. Visual C++ 10.0 jest niezgodny z wrt. do konstruktorów; na ogół trzeba zapewnić obejście. Był to, jak na ironię, z powodu tego, co Microsoft myśli było bug-fix - wprowadzono konstruktora biorąc int
argumentu, o ile pamiętam.
std::vector<bool>
jest zoptymalizowany w taki sam sposób, jak std::bitset
. Koszt: indeksowanie nie zapewnia bezpośrednio odniesienia (nie ma odniesień do poszczególnych bitów w C++), ale zwraca obiekt proxy - co nie jest czymś, co można zauważyć, dopóki nie spróbujesz użyć go jako punktu odniesienia. Zaleta: minimalne miejsce do przechowywania, a wektor można zmienić w razie potrzeby.
Po prostu za pomocą np. unsigned
jest również opcją, jeśli masz do czynienia z niewielką liczbą bitów (w praktyce, 32 lub mniej, chociaż formalna gwarancja to tylko 16 bitów).
Wreszcie, wszystkie identyfikatory WIELKIEJ UPPERC są konwencją (z wyjątkiem Microsoft) zarezerwowaną dla makr, aby zmniejszyć prawdopodobieństwo kolizji nazw. Dlatego dobrze jest nie używać wszystkich identyfikatorów WIELKIEJ UPPERCASE do niczego innego niż makra. I zawsze używać WSZYSTKICH identyfikatorów UPPERCASE dla makr (ułatwia to również ich rozpoznawanie).
Cheers & HTH.,
Cytując stronę cplusplus.com w sprawie bitset „Klasa jest bardzo podobna do zwykłej tablicy, ale optymalizacji alokacji przestrzeni”. Jeśli twoje int są 4 bajty, bitset używa 32 razy mniej miejsca. – AlcubierreDrive
Twoja struktura "BIT" zostanie wyrównana w każdym razie do (co najmniej) jednego bajtu. – Archie
@Jon, post to jako odpowiedź. (To dobra uwaga.) –