[H-L-L.ru]

Форма входа

Меню сайта

Categories
1. Основы работы в среде C++ Builder.Основы языка Си++ [9]
2. Операторы ветвления и операторы передачи управления [4]
3. Операторы цикла и операторы передачи управления [5]
4. Одномерные массивы [3]
5. Многомерные массивы [3]
6. Указатели.Динамическое распределение памяти [6]
7. Отладка программы [3]
8. Функции [8]
9. Строки [5]
10. Функция Main [2]
11. Типы данных,определяемые пользователем [5]
12. Потоки ввода/вывода [7]
13. Основы объектно-ориентированного программирования [5]
Приложения [11]

Главная » Статьи » Лекции по C++ » 11. Типы данных,определяемые пользователем

4. Операции со структурами. Битовые поля в структуре

      Операции со структурами.

Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции. При обращении к численным и логическим данным структуры производится обычное присваивание, а заполнение строковых членов структуры осуществляется с помощью функций работы со строками (в частности функция 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
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Полная версия сайта