Язык программирования C++ от Страуструпа


Поля


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



Содержание раздела