716_____________________________________________Глава 12

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

При объявлении битового поля вслед за указанием типа элемента ставится
двоеточие (:) и пишется целочисленная константа, задающая ширину поля (т.е.
число битов, в которых хранится этот элемент). Ширина поля должна быть цело-
численной константой в диапазоне между 0 и заданным общим числом битов, ис-
пользуемых для хранения целого значения типа int в вашей системе. Например:

struct TPers (

AnsiString Fam,Nam,Par;

AnsiString Dep;

TPers *    pr;

unsigned   Year : 12;

bool       Sex : 1;

};

Можно задавать неименованное битовое поле. Такое поле используется в
структуре как заполнение. Дело в том, что при работе с битовыми полями надо
учитывать длину машинного слова. Если следующий элемент структуры не явля-
ется битовым полем, то место его хранения должно начинаться с нового машинно-
го слова. Для округления объемов памяти до слова, т.е. для заполнения оставших-
ся неиспользованными битов и вводятся неименованные битовые поля. В приве-
денном ниже прим&ре неименованное поле шириной в 3 бита используется как за-
полнение:

struct Example {
unsigned a : 13;

unsigned   : 3;

unsigned b : 4;

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

Предупреждение

Манипуляции с битовыми полями являются машинно-зависимыми. Например, в некоторых
компьютерах битовые поля могут пересекать границы машинного слова, тогда как в других
компьютерах это недопустимо.

12.12 Объединения

Объединение (union) — это область памяти, в которой в разные моменты вре-
мени могут находиться объекты разных типов. В любой момент времени объедине-
ние может содержать максимум один объект, потому что элементы объединения
совместно используют одну и ту же область памяти. На программиста возлагается
обязанность следить за тем, чтобы к данным в объединении обращались по имени
элемента соответствующего типа данных. Если тип ссылки на элемент объедине-
ния не соответствует типу данных, хранящемуся в этот момент в объединении, то
возникает ошибка, последствия которой зависят от реализации системы.

В разные отрезки времени выполнения программы некоторые объекты могут
быть не нужны, т.е. программе требуется только часть ее объектов. Вместо того,
чтобы впустую растрачивать память на объекты, которые используются не посто-
янно, можно поместить их в объединение, где они будут делить между собой одну
и ту же область памяти. Число байтов памяти, выделяемых для объединения, дол-
жно быть не меньше, чем размер самого большого элемента объединения.