[H-L-L.ru] |
Форма входа |
Меню сайта |
Главная » Статьи » Лекции по C++ » 11. Типы данных,определяемые пользователем |
Операции со структурами.Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции. При обращении к численным и логическим данным структуры производится обычное присваивание, а заполнение строковых членов структуры осуществляется с помощью функций работы со строками (в частности функция 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 бита могут быть размещены только в пяти байтах). Источник: операции со структурами c++ битовые поля | |
Всего комментариев: 0 | |