Язык С




Поля


Когда вопрос экономии памяти становится очень существен- ным, то может оказаться необходимым помещать в одно машинное слово несколько различных объектов; одно из особенно расп- росраненных употреблений - набор однобитовых признаков в применениях, подобных символьным таблицам компилятора. внеш- не обусловленные форматы данных, такие как интерфейсы аппа- ратных средств также зачастую предполагают возможность полу- чения слова по частям. Представьте себе фрагмент компилятора, который работает с символьной таблицей. С каждым идентификатором программы связана определенная информация, например, является он или нет ключевым словом, является ли он или нет внешним и/или статическим и т.д. Самый компактный способ закодировать та- кую информацию - поместить набор однобитовых признаков в от- дельную переменную типа CHAR или INT. Обычный способ, которым это делается, состоит в опреде- лении набора "масок", отвечающих соответствущим битовым по- зициям, как в

#DEFINE KEYWORD 01 #DEFINE EXTERNAL 02 #DEFINE STATIC 04

(числа должны быть степенями двойки). Тогда обработка битов сведется к "жонглированию битами" с помощью операций сдвига, маскирования и дополнения, описанных нами в главе 2. Некоторые часто встречающиеся идиомы:

FLAGS \!= EXTERNAL \! STATIC;

включает биты EXTERNAL и STATIC в FLAGS, в то время как

FLAGS &= \^(еXTERNAL \! STATIC);

их выключает, а

IF ((FLAGS & (EXTERNAL \! STATIC)) == 0) ...

истинно, если оба бита выключены. Хотя этими идиомами легко овладеть, язык "C" в качестве альтернативы предлагает возможность определения и обработки полей внутри слова непосредственно, а не посредством побито- вых логических операций. Поле - это набор смежных битов внутри одной переменной типа INT. Синтаксис определения и обработки полей основывается на структурах. Например, сим- вольную таблицу конструкций #DEFINE, приведенную выше, можно бы было заменить определением трех полей:

STRUCT \( UNSIGNED IS_KEYWORD : 1; UNSIGNED IS_EXTERN : 1; UNSIGNED IS_STATIC : 1; \) FLAGS;




Содержание  Назад  Вперед