Pola bitowe języka C++
Klasy i struktur mogą zawierać członków, którzy zajmują mniej pamięci niż typ integralny.Te elementy są określone jako pola bitowe.Składnia specyfikacji pola bitowego Deklarator członka wygląda następująco:
declarator : constant-expression
Uwagi
(Opcjonalnie) declarator jest nazwą, za pomocą której członek jest dostępny w programie.Musi być typem całkowitym (wliczając typy wyliczane).Stała wyrażenia określa liczbę bitów członka zajmowaną w strukturze.Anonimowe pola bitowe — oznaczają, że to pole bitowe członków nie posiada identyfikatora — może być użyte do uzupełniania.
[!UWAGA]
Pole bitowe nienazwane o szerokości 0 wymusza wyrównanie pola bitowego do następnej granicy type, gdzie type jest typem członka.
Poniższy przykład pokazuje deklarację struktury, która zawiera pola bitowe:
// bit_fields1.cpp
// compile with: /LD
struct Date {
unsigned short nWeekDay : 3; // 0..7 (3 bits)
unsigned short nMonthDay : 6; // 0..31 (6 bits)
unsigned short nMonth : 5; // 0..12 (5 bits)
unsigned short nYear : 8; // 0..100 (8 bits)
};
Układ koncepcyjny pamięci obiektu typu Date jest pokazany na poniższym rysunku.
Układ pamięci obiektu Date
Należy zauważyć, że nYear ma długość 8 bitów i spowodowałby przepełnienie granicy słowa deklarowanego typu liczba całkowita krótka bez znaku.W związku z tym, rozpoczęte jest to na początku nowej liczby całkowitej krótkiej bez znaku.Nie jest konieczne, aby wszystkie pola bitowe mieściły się w jeden obiekt typu podstawowego; nowe jednostki pamięci są przydzielane zgodnie z liczbą bitów wymaganych w deklaracji.
Specyficzne dla firmy Microsoft
Porządkowanie danych zadeklarowanych jako pola bitowe odbywa się od minimalnego do maksymalnego bitu, jak pokazano na powyższym rysunku.
KONIEC informacji specyficznych dla firmy Microsoft
Jeśli deklaracja struktury zawiera nienazwane pole o długości 0, jak pokazano w poniższym przykładzie,
// bit_fields2.cpp
// compile with: /LD
struct Date {
unsigned nWeekDay : 3; // 0..7 (3 bits)
unsigned nMonthDay : 6; // 0..31 (6 bits)
unsigned : 0; // Force alignment to next boundary.
unsigned nMonth : 5; // 0..12 (5 bits)
unsigned nYear : 8; // 0..100 (8 bits)
};
układ pamięci wygląda tak, jak pokazano na poniższym rysunku.
Układ obiektu Date dla pola bitowego o zerowej długości
Typ podstawowy pola bitowego musi być typem całkowitym, zgodnie z opisem w Podstawowych typów.