9.3. СТРУКТУРНЫЕ ТИПЫ
517
ных записей.
Средства оперирования для записей расширяются за счет оператора при-
соединения
with
, который позволяет однократно указывать запись, к которой
применяются селекторы для извлечения полей:
with <имя записи> do <оператор /* фрагмент */>
В результате имена полей пополняют контекст фрагмента, подчиняясь прави-
лам локализации имен.В частности, имена полей становятся приоритетными
при поиске определяющих вхождений идентификаторов в программе.
Оператор присоединения является средством скорописи для языка, но
очень часто он помогает повысить выразительность программ. Для фрагмен-
та после do он задает дополнительный контекст выполнения, причем поиме-
нованный (именем записи). Т. е. фрагмент может использовать поля в каче-
стве добавочной системы понятий. Полезность этого качества хорошо по-
нимали разработчики языка
Симула-67
, появившегося, когда записей еще не
придумали.Они отразили его в конструкции префикс-класса для (операцион-
ного) блока, тем самым дали возможность наиболее выразительно предста-
влять в программе средства, описанные при определении объектов. В
С++
,
как и в других языках того же рода, объектная ориентированность строит-
ся на базе понятия записи (структуры), но нет присоединений, которые мог-
ли бы в манере префикс-классов явно выделять то, что доступно от объекта
(в
Object Pascal
такая возможность есть). Мотивируется это тем, что из-за
возможного перемешивания селектирования и присоединения трудно разби-
раться с контекстами фрагмента, которые пополняются без явного разграни-
чения, какие имена к чему относятся.
Представление записей в программе допускает следующие варианты:
• стандартное, когда каждое поле получает собственный адрес. В этом
случае время доступа к полю оказывается минимальным;
• со свободной упаковкой, когда привязка полей к регистрам осуществля-
ется с учетом побайтового их разбиения, что несколько замедляет до-
ступ по сравнению со стандартным случаем, если вычислитель не до-
пускает байтовой адресации;
• с жесткой упаковкой,когда размер памяти, выделяемой под поле, стро-
го соответствует необходимому для размещения самого большого зна-
чения числу разрядов;
• ссылочное, когда некоторые компоненты записи задаются как другие
записи уровня представления, состоящие из двух полей: