Бьерн Страуструп - Язык программирования С++. Главы 2-4
Страница 27. Поля



2.6.1  Поля

Кажется расточительным использовать для признака, принимающего
только два значения ( например: да, нет) тип char, но объект типа
char является в С++ наименьшим объектом, который может независимо
размещаться в памяти. Однако, есть возможность собрать переменные
с малым диапазоном значений воедино, определив их как поля структуры.
Член структуры является полем, если в его определении после имени
указано число разрядов, которое он должен занимать. Допустимы
безымянные поля. Они не влияют на работу с поименованными полями,
но могут улучшить размещение полей в памяти для конкретной машины:

       struct sreg {
              unsigned enable : 1;
              unsigned page : 3;
              unsigned : 1;        // не используется
              unsigned mode : 2;
              unsigned : 4;        // не используется
              unsigned access : 1;
              unsigned length : 1;
              unsigned non_resident : 1;
        };

Приведенная структура описывает разряды нулевого
регистра состояния DEC PDP11/45 (предполагается, что поля в слове
размещаются слева  направо).  Этот  пример  показывает   также   другое
возможное применение полей: давать имена тем частям
объекта, размещение которых определено извне. Поле должно иметь
целый тип ($$R.3.6.1 и $$R.9.6), и оно используется аналогично другим
объектам целого типа. Но есть исключение: нельзя брать адрес поля.
В ядре операционной системы или в отладчике тип sreg мог бы
использоваться следующим образом:

            sreg* sr0 = (sreg*)0777572;
            //...
            if (sr0->access) {        // нарушение прав доступа
                // разобраться в ситуации
               sr0->access = 0;
            }

 Тем не менее,
 применяя поля для упаковки нескольких переменных в один байт, мы
 необязательно сэкономим память. Экономится память для данных, но
 на большинстве машин одновременно возрастает объем команд,
 нужных для работы с упакованными данными.
 Известны даже такие программы, которые значительно сокращались в объеме,
 если двоичные переменные, задаваемые полями, преобразовывались в
 переменные типа char! Кроме того, доступ к char или int обычно
 происходит намного быстрее, чем доступ к полю. Поля - это просто
 удобная краткая форма задания логических операций для извлечения
 или занесения информации в части слова.

 
« Предыдущая статья   Следующая статья »