Pola bitowe języka C++

Klasy i struktury mogą zawierać elementy członkowskie, które zajmują mniej miejsca do magazynowania niż typ całkowity. Te elementy członkowskie są określane jako pola bitowe. Składnia specyfikacji deklaratora elementów członkowskich pola bitowego jest następująca:

Składnia

deklarator:wyrażenie-stałe

Uwagi

Deklarator (opcjonalny) to nazwa, do której jest uzyskiwany dostęp do elementu członkowskiego w programie. Musi być typem całkowitym (w tym typami wyliczonymi). Wyrażenie stałe określa liczbę bitów, które członek zajmuje w strukturze. Anonimowe pola bitowe — czyli elementy członkowskie pól bitowych bez identyfikatora — mogą być używane do uzupełniania.

Uwaga

Pole bitowe o szerokości 0 nienazwane wymusza wyrównanie następnego pola bitowego do granicy następnego typu , gdzie typ jest typem elementu członkowskiego.

Poniższy przykład deklaruje strukturę zawierającą 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)
};

Koncepcyjny układ pamięci obiektu typu Date przedstawiono na poniższej ilustracji:

Diagram of the memory layout of a date object, showing where the n WeekDay, n MonthDay, n Month, and n Year bit fields are located.

32 bity pamięci są wyświetlane w wierszu. Począwszy od najmniej znaczącego bitu, 3 bity są dla nWeekDay. Następne 6 bitów są dla nMonthDay. Następne 5 bitów to nMonth. Następne 2 bity są nieużywane. Następne 8 bitów są przeznaczone dla nYear. Pozostałe 8 bitów są nieużywane.

nYear ma długość 8 bitów, co spowodowałoby przepełnienie granicy słowa zadeklarowanego typu unsigned short. W związku z tym rozpoczyna się od początku nowego unsigned shortelementu . Nie jest konieczne, aby wszystkie pola bitowe mieściły się w jednym obiekcie typu bazowego; przydzielane są nowe jednostki magazynu, zgodnie z liczbą bitów żądanych w deklaracji.

Specyficzne dla firmy Microsoft

Kolejność danych zadeklarowanych jako pola bitowe wynosi od niskiego do wysokiego bitu, jak pokazano na poprzedniej ilustracji.

END Microsoft Specific

Jeśli deklaracja struktury zawiera pole o długości 0 bez nazwy, 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)
};

Następnie układ pamięci jest pokazany na poniższym rysunku:

Diagram of the layout of a Date object, with a zero length bit field, which forces alignment padding.

64 bity pamięci są wyświetlane w wierszu. Począwszy od najmniej znaczącego bitu, 5 bitów to n Miesiąc. Następne 8 bitów to n Rok. Kolejne 19 bitów są nieużywane. Następne 3 bity są dla n WeekDay. Następne 6 bitów to n MonthDay. Pozostałe bity są nieużywane.

Podstawowy typ pola bitowego musi być typem całkowitym, zgodnie z opisem w artykule Typy wbudowane.

Jeśli inicjator odwołania const T& typu jest wartością lvalue odwołującą się do pola bitowego typu T, odwołanie nie jest powiązane bezpośrednio z polem bitowym. Zamiast tego odwołanie jest powiązane z tymczasowym zainicjowanym w celu przechowywania wartości pola bitowego.

Ograniczenia dotyczące pól bitowych

Poniższa lista zawiera szczegółowe informacje o błędnych operacjach na polach bitowych:

  • Biorąc adres bitowego pola.

  • Inicjowanie odwołania innego niżconst pole bitowe.

Zobacz też

Klasy i struktury