Для переменных одного и того же
структурного типа определена операция присваивания, при этом происходит
поэлементное копирование. Структуру можно передавать в функцию и возвращать в
качестве значения функции. При обращении к численным и логическим данным
структуры производится обычное присваивание, а заполнение строковых членов
структуры осуществляется с помощью функций работы со строками (в частности
функция strcpy).
Другие операции со структурами могут быть
определены пользователем с помощью перегрузки операций.
Битовые поля – это особый вид полей структуры. Они используются для плотной
упаковки данных, например, флажков типа «да/нет». Минимальная адресуемая ячейка
памяти – 1 байт, а для хранения
флажка достаточно одного бита. При описании битового поля после имени через
двоеточие указывается длина поля в битах (целая положительная константа):
struct Options{
bool centerX:1;
bool centerY:1;
unsigned int shadow:2;
unsigned int palette:4; };
Битовые поля могут быть любого целого
типа. Имя поля может отсутствовать, такие поля служат для выравнивания на
аппаратную границу. Доступ к полю осуществляется обычным способом – по имени. Адрес поля получить
нельзя, однако в остальном битовые поля можно использовать точно так же, как
обычные поля структуры. Следует учитывать, что операции с отдельными битами
реализуются гораздо менее эффективно, чем с байтами и словами, так как
компилятор должен генерировать специальные коды, и экономия памяти под
переменные оборачивается увеличением объема кода программы. Размещение битовых
полей в памяти зависит от компилятора и аппаратуры.
Рассмотрим небольшой пример. Допустим,
необходимо создать структуру, содержащую информацию о дате и времени некоторых
событий. Этого можно добиться следующим путем:
struct DATETIME
{
unsigned short Year; // год
unsigned short Month; // месяц
unsigned short Date; // дата
unsigned short Hour; // часы
unsigned short Minute; // минуты
unsigned short Second; // секунды
};
Таким образом, объект типа DATETIME в памяти будет
занимать 6(элементов) х 2(байта) = 12 байт. Нетрудно заметить, что в описании
такой структуры присутствует значительная избыточность, так как год может принимать
значения от 0 до 99 (задействуется всего 7 бит), месяц - от 1 до 12 (4 бита),
дата - от 1 до 31 (5 бит), часы, минуты и секунды - от 0 до 59 (по 6 бит на каждый
элемент). Применяя битовые структуры, приведенная выше структура примет вид:
struct DATETIME2
{
unsigned short Year:7; // год
unsigned short Month:4; // месяц
unsigned short Date:5; // дата
unsigned short Hour:6; // часы
unsigned short Minute:6; // минуты
unsigned short Second:6; // секунды
};
Экземпляр модифицированного типа DATETIME2 будет занимать не
12, а 5 байт (так как 34 бита могут быть размещены только в пяти байтах).
|