Битовые поля C++

Классы и структуры могут содержать члены, которые занимают меньше памяти, чем объединенного типа.Эти элементы определяются как битовые поля.Синтаксис для бит-поля участник-декларатор спецификация выполните:

declarator  : constant-expression

Заметки

(Необязательно) declarator имя, под которым участник получить доступ в программе.Должно быть объединенным типом (в том числе перечисленных типов).константное выражение указывает число битов элемент занимает место в структуре.Анонимные битового поля, т е элементы бит-поля без идентификатора - можно использовать для заполнения.

ПримечаниеПримечание

Анонимное битовое поле шириной 0 обеспечивает следующие битовые поля к следующему выравнивание type граница, где type тип элемента.

В следующем примере объявляется структуру, содержащий битовые поля:

// 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)
};

Концептуальная структура памяти объекта типа Date показано на следующем рисунке.

Структура памяти объекта даты

График структуры памяти объекта даты

Обратите внимание, что nYear 8 бит длиной и переполнили бы граница машинного слова объявленного типа, unsigned short.Поэтому он разработан в начале новой unsigned short.Битовые поля не требуется, что все подходящие в одном объекте базового типа; новые единицы хранения выбираются в соответствии с количеством бит в объявлении запрошенного.

Только для систем Microsoft

Упорядочение данных, объявленных в качестве битового поля из низкого уровня в старшему биту, как показано на рисунке выше.

ЭЛЕМЕНТ, относящийся Майкрософт

Если объявление структуры содержит безымянное поле длиной 0, как показано в следующем примере,

// 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)
};

структура памяти как показано на следующем рисунке.

Структура объекта даты битовое поле с нулевой длиной

Структура объекта даты битовое поле с длинной 0

Базовый тип битового поля должен быть объединенным типом, как описано в разделе Базовые типы.

См. также

Ссылки

Классы, структуры и объединения