Skip to the content.

Bit-fields


Битовые поля могут быть использованы только внутри структур (struct, class, union, …). Они позволяют упаковать данные, например: bool занимает 1 байт, но его значение можно уместить в 1 бит (0 или 1), соответственно память используется нерационально, но по другому никак, минимальное адресуемое равно 1 байту. При помощи битовых масок можно сделать так, что в 1 bool будет храниться 8 разных значений. Это и позволяют нам сделать битовые поля, только не прибегая к написанию своих битовых масок. У такого подхода есть и минусы: мы выиграли в памяти, но проиграли в скорости, ведь применить битовую маску намного дольше чем просто обратиться к bool.

struct Flags
{
  bool b1 : 1; // 1 битный
  bool b2 : 1;
  bool b3 : 1;
  bool b4 : 1;
  bool b5 : 1;
  bool b6 : 1;
  bool b7 : 1;
  bool b8 : 1;
};

Структура Flags содержит восемь 1-битных полей типа bool, которые все будут упакованы в 1 байт.

sizeof(Flags) // 1 

Упаковывать можно так же и другие типы и не обязательно по одному биту. Два int по 4-бита будут упакованы в 4 байта (потому что на int выделяется 4 байта):

struct Flags
{
    unsigned int x : 4;
    unsigned int y : 4;
};

Соответственно в такую переменную можно будет записать значение не больше 4 бит (1111 -> 15), иначе будет переполнение: 16 -> 0 (это справедливо для unsigned, для простого int диапазон [-8; 7]).