Лекция № 22. Динамические переменные. Ссылочные типы
Перед выполнением программ выполняются этапы компиляции и компоновки. При компоновке программы в памяти формируются несколько специальных областей, предназначенных для хранения всех используемых в данной программе переменных. Для хранения глобальных переменных и типизированных констант формируется область, которая называется сегментом данных.Каждая переменная в зависимости от типа получает определенное количество байтов в сегменте данных. Суммарный размер сегмента данных определяется суммой затрат памяти на хранение всех переменных. Размер сегмента данных не изменяется от начала до конца выполнения программы. Во многих системах программирования его размер ограничен, например в ТР он не может превышать 64 Кбайт.
Для хранения локальных переменных и параметров процедур и функций используется другая область памяти, которая называется стек. При каждом вызове подпрограммы ее локальные переменные и параметры помещаются в стек, а по окончании работы подпрограммы – автоматически из него удаляются. Однако память под стек отводится еще до начала выполнения подпрограммы, и размер этой памяти не может быть изменен по ходу ее выполнения. Суммарный размер памяти, отведенный под стек в ТР по умолчанию составляет – 16 КБайт и его можно увеличить, но существует ограничение, которое составляет 64 Кбайт.
Для того, чтобы преодолеть существующие ограничения на размеры памяти под переменные программы и в целях рационального использования памяти, ТР предоставляет возможность создавать и уничтожать переменныепо ходу выполнения программы. Такие переменные не объявляются в разделе объявлений и не имеют своего собственного имени, а память под них выделяется в соответствии с инструкциями программы. Эти переменные называются динамическими. Они создаются не в сегменте данных и не в стеке, для них имеется еще одна дополнительная область памяти, которая называется динамически распределяемой областьюиликучей.
Динамическая память – это оперативная память ПК, предоставляемая программе при ее работе. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от динамического размещения данных, при статическом размещении выделение памяти осуществляется компилятором ТР во время компиляции программы. При динамическом размещении заранее неизвестны ни тип, ни количество размещаемых данных.
Работать с переменными в куче можно с помощью гибкого средства управления динамической памятью – так называемыми указателями. Их основное назначение состоит в том, чтобы обеспечить механизм использования в программе динамических переменных, т.е. переменных, которые создаются в памяти и удаляются из нее по ходу выполнения программы.
Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти.С помощью указателей можно размещать в динамической памяти любой тип данных. Некоторые типы данных (byte, shortint, char, boolean) занимают во внутреннем представлении ПК всего один байт, остальные – по несколько смежных, поэтому указатель адресует лишь первый байт данных. Указатели бывают двух видов: типизированный и нетипизированный.
Типизированный указатель связывается с некоторым типом данных.Для объявления типизированного указателя применяется значок ^, который помещается перед соответствующим типом, например:
Var
P1: ^integer;
P2: ^real;
Указатели можно объявлять, не связывая их с каким-либо конкретным типом данных. Указатели такого рода называются нетипизированными. Для объявления непизированных указателей служит стандартный тип – Pointer,например:
Var
P: Pointer;
С помощью нетипизированных указателей удобно динамически размещать данные, структура и тип которых меняются в ходе программы. В ТР можно передавать значения одного указателя другому, связанным с одним и тем же типом данных, например:
Var
p1, p2: ^integer;
P3: ^real;
P: Pointer;
то присваивание
p1:= p2;
p1:= p;
p3:= p;
p:= p1;
вполне допустимо, когда, как
p2:= p3;
p3:= p1;
запрещено, т.к. p1, p2и p3 указывают на разные типы данных. Эти ограничения не распространяются на нетипизированные указатели, т.к. они совместимы со всеми типами указателей.
Каждый указатель размещается в сегменте или в стеке (в зависимости от его объявления) и занимает там 4 байта. Например, для хранения в динамической памяти массивов больших размеров лишние четыре байта на указатель несущественны. Объявить указатель на массив можно так:
type massiv = array[1..1000] of real;
var pmassiv: ^massiv;
При таком объявлении память будет выделена только под указатель. Под массив выделится память при его создании в программе.
Дата добавления: 2017-11-04; просмотров: 622;