3. Типы данных
31
в некоторых случаях к большим затратам памяти из-за усложненного доступа к таким
упакованным компонентам. Другими словами, съэкономленная упаковкой данных
память уйдет на увеличение кода программы из-за того, что данные упакованы.
Поэтому в UniPascal-е воспринято компромиссное решение. Упаковка делается
только на границе байта. Этим способом поддержка упакованных компонент делается
легче. При использовании упакованных типов надо иметь ввиду, что их компоненты не
могут быть параметрами-переменными (см. п. 7).
3.3. Ссылочные типы
Ссылочный тип отличается от простых и составных типов тем, что его множество
значений динамическое - значения любого ссылочного типа порождаются и
уничтожаются в процессе выполнения программы. Разница между статическими и
динамическими структурами состоит не только в моменте зарезервирования памяти,
но и в том, что динамические структуры обычно используются для представления
рекурсивных структур данных, т.е. структура, включающая явным или неявным
образом себя в свое определение. Ее длина не известна в процессе компиляции и,
обычно, меняется во время выполнения программы.
PointerType =
'^' TypeIdent.
Каждый ссылочный тип (PointerType) состоит из неограниченного множества
значений, указывающих на элементы базового типа (TypeIdent). Значением переменной
ссылочного типа является адрес динамической переменной в оперативной памяти. Если
базовый тип неопределен во время описания ссылочного типа, то он должен быть
описан до конца текущего раздела типов. В противном случае выдается сообщение об
ошибке.
Над указателями определены только операции присваивания (:=) и проверки на
равенство (=) и различие (<>). Значение NIL (пустой указатель) принадлежит всем
ссылочным типам. Оно не указывает ни на какой элемент. Для обработки объектов
ссылочного типа используются следующие стандартные процедуры: New - создает
динамическую переменную базового типа, резервируя часть оперативной памяти;
Dispose - освобождает резервированную для некоторой динамической переменной
память; Mark - отмечает память некоторой динамической переменной для
последующего освобождения; Release - освобождает динамическую память,
отмеченную процедурой Mark.
Процедуры MARK и RELEASE являются заместителями процедуры DISPOSE.
Который из этих двух методов MARK-RELEASE или DISPOSE будеть использован для
освобождения занятой памяти - вопрос конкретной необходимости и организации
данных в программе. Не рекомендуется одновременное использование обоих методов
в программе, потому что это может привести к неосвобождению памяти (см. п. 12).
3.4. Идентичность и совместимость типов данных
В процессе составления программы необходимо знать отношения переменных
разного типа. Программисту, обычно, интуитивно ясна совместимость типов данных
(т.е. переменные каких типов могут участвовать в одном выражении). Компилятору, с
другой стороны, совместимость строго определена.
В Pascal-е введена сильная типизация. Типизация бывает структурной и именной.
Вообще говоря, при структурной типизации два типа совместимы, если их структуры
<<  <  GO  >  >>

Вернуться к началу сайта