Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 184

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 178 179 180 181 182 183 < 184 > 185 186 187 188 189 190 .. 316 >> Следующая

Таким образом, селекторы полей для записи сужают возможности абстрактных селекторов: единственный их идентификационный аргумент — это имя поля. Традиционное обозначение для такого селектора
<имя записи> "." <имя поля>. В С/С++ есть возможность наложения записи (структуры) на произвольную область памяти. на предоставляется как результат вчисления указателей.
этом случае мо но опускать имя записи при задании селектора, а вместо него и последующей точки писать "->". Такой способ может приводить к двусмысленности, когда указатель способен ссылаться на экземпляры различ-
9.3.
517
нх записей.
Средства оперирования для записей расширяются за счет оператора присоединения with, который позволяет однократно указывать запись, к которой применяются селекторы для извлечения полей:
with <имя записи> do <оператор /* фрагмент */> В результате имена полей пополняют контекст фрагмента, подчиняясь правилам локализации имен. В частности, имена полей становятся приоритетными при поиске определяющих вхождений идентификаторов в программе.
ператор присоединения является средством скорописи для язка, но очень часто он помогает повысить выразительность программ. ля фрагмента после do он задает дополнительный контекст выполнения, причем поименованный (именем записи). Т. е. фрагмент может использовать поля в качестве добавочной системы понятий. Полезность этого качества хорошо понимали разработчики языка Симула-67, появившегося, когда записей еще не придумали. ни отразили его в конструкции префикс-класса для (операционного) блока, тем самым дали возмо ность наиболее вразительно представлять в программе средства, описанные при определении объектов. В С++, как и в других языках того же рода, объектная ориентированность строится на базе понятия записи (структур ), но нет присоединений, которе могли б в манере префикс-классов явно вделять то, что доступно от объекта (в Object Pascal такая возможность есть). Мотивируется это тем, что из-за возможного перемешивания селектирования и присоединения трудно разбираться с контекстами фрагмента, которые пополняются без явного разграничения, какие имена к чему относятся.
редставление записей в программе допускает следуие варианты:
• стандартное, когда каждое поле получает собственный адрес. В этом случае время доступа к полю оказывается минимальным;
• со свободной упаковкой, когда привязка полей к регистрам осуществляется с учетом побайтового их разбиения, что несколько замедляет доступ по сравнени со стандартным случаем, если вчислитель не допускает байтовой адресации;
• с еской упаковкой, когда размер памяти, выделяемой под поле, строго соответствует необходимому для размеения самого болього значения числу разрядов;
• ссылочное, когда некоторые компоненты записи задаются как другие записи уровня представления, состоящие из двух полей:
518
9.
- указатель на представление поля исходной записи,
- представление поля исходной записи, которое размещается в области памяти, доступной через указатель.
ссылочном представлении поле исходной записи заменено указателем на то место, где хранятся его значения. Это удобно в двух случаях:
• когда для разных экземпляров записи значения поля, требующего много памяти, могут повторяться,
• когда память, ну ная для значения поля, не имеет фиксированного размера.
В качестве примера первого рода можно рассмотреть записи в базе данных, а в качестве примера второго рода — поля типа variant.
а абстрактном уровне рассмотрения, как и всегда, представления неразличим . оэтому, к примеру, в ссылочном представлении указатель на поле является невидимым и не участвует в оперировании. Задача реализации представления состоит в том, чтобы обеспечить доступ к полям на абстрактном уровне.
опять м сталкиваемся с проблемой, обозначенной при сопоставлении концепции абстрактных типов данных с объектно-ориентированным программированием. Корректно реить в язке указанну задачу, игнорируя требование существования функции абстракции (см. п. 9.1.5), не представляется возможным.
В связи с типом записей полезно проследить аналоги меду двумя видами структур программ : операционной и данных, т. е. указать параллели и расхо дения меду понятием записи и последовательным (совместным) выполнением операторов.
(1). ператор как элемент операционной абстракции играет ту е роль, что и поле, рассматриваемое как элемент абстракции данных.
(2). Последовательность операторов как синтаксическая единица аналогична списку полей записи, конкретизируих список компонентов универсального набора.
(3). Исполнение последовательности операторов может быть последовательным, параллельнм, а так е параллельно-совместнм и последователь-но-совместнм. менно последний вариант соответствует поняти произвольного доступа к полям записи.
9.3. СТРУКТУРНЫЕ ТИПЫ
519
(4). менование. ля операторов — это метки, к которым мо но переходить. Оно не является обязательным (операторы чаще всего остаются неименованными). Для процедур это имена (вместе с сигнатурами, если воз-мо ен их полиморфизм). ля записей обязательно употребление имен полей, т. к. лиь они да т идентифицируу их информаци .
Предыдущая << 1 .. 178 179 180 181 182 183 < 184 > 185 186 187 188 189 190 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100