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

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

Синтаксис

декларатор:constant-expression

Замечания

Декларатор (необязательно) — это имя, с помощью которого член обращается к программе. Он должен иметь один из целочисленных типов (включая перечисляемые типы). Константное выражение указывает количество битов, которые занимает член в структуре. Анонимные битовые поля ( то есть члены битового поля без идентификатора) можно использовать для заполнения.

Примечание.

Неназванное битовое поле ширины 0 заставляет выравнивание следующего битового поля на следующую границу типа , где тип является типом элемента.

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

// 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 показан на следующем рисунке:

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 бита памяти отображаются в строке. Начиная с наименьшего значения, 3 бита предназначены для nWeekDay. Следующие 6 битов предназначены для nMonthDay. Следующие 5 битов предназначены для nMonth. Следующие 2 бита не используются. Следующие 8 битов предназначены для nYear. Оставшиеся 8 битов не используются.

nYearимеет длину 8 битов, что приведет к переполнению границы слова объявленного типа. unsigned short Таким образом, он начинается в начале нового unsigned short. Не обязательно, чтобы все битовые поля соответствовали одному объекту базового типа; новые единицы хранения выделяются в соответствии с количеством битов, запрошенных в объявлении.

Блок, относящийся только к системам Майкрософт

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

Завершение блока, относящегося только к системам Майкрософт

Если объявление структуры содержит неназванное поле длиной 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)
};

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

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

64 бита памяти отображаются в строке. Начиная с наименьшего значительного бита, 5 битов в течение n месяца. Следующие 8 битов для n Года. Следующие 19 битов не используются. Следующие 3 бита для n WeekDay. Следующие 6 битов для n MonthDay. Остальные биты не используются.

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

Если инициализатор для ссылки const T& типа является lvalue, который ссылается на битовое поле типа T, ссылка не привязана к битовому полю напрямую. Вместо этого ссылка привязана к временной инициализированной для хранения значения битового поля.

Ограничения для битовых полей

В следующем списке указаны ошибочные операции с битовыми полями:

  • Получение адреса битового поля.

  • Инициализация ссылки, отличнойconst от ссылки, с помощью битового поля.

См. также

Классы и структуры