Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к пр з №1 и 2 прог ч2 2011.doc
Скачиваний:
4
Добавлен:
23.11.2018
Размер:
264.19 Кб
Скачать

Методические указания

К п.1. Вся оперативная память делится на сегменты размером , не превышающим 65536 байт(64К). Сегменты, в которых размещаются главная программа и ее модули, а также стандартный библиотечный модуль SYSTEM, называются сегментами кода. В сегменте данных размещаются глобальные переменные и типизированные константы, объявленные в главной программе и секциях связи модулей. Сегмент стека служит для размещения локальных данных подпрограмм и внутренних данных модулей. Сегмент стека загружается при каждом обращении к подпрограмме и освобождается при выходе из нее. Таким образом максимальный размер определяется количеством вложенных вызовов процедур и суммарным количеством их локальных переменных.

Размеры сегмента кода и сегмента данных определяются в процессе компиляции компоновщика (Linker) и во время работы не меняются. Размер сегмента стека устанавливается по умолчанию равным 16К и может быть изменен (не более 64К) опцией Option/Memory/Sizes установкой размера в поле Stack size.

Сегменты программы располагаются в памяти в определенном порядке: сначала сегмент кода главной программы, затем сегменты кода неоверлейных модулей, следом сегмент данных и, наконец, сегмент стека. За сегментом стека следует оверлейный буфер, размер которого может устанавливаться программистом. Оставшаяся свободной область частично или полностью может быть занята динамической памятью. В ней размещаются динамические переменные.( см. рисунок 1). Эта часть памяти называется heap (“куча”)

Динамические переменные создаются и уничтожаются во время выполнения программы в отличие от статических переменных, память под которые резервируется в сегменте данных еще на этапе компиляции. Размер кучи (минимальный и максимальный размер) можно установить уже известной опцией Option/Memory/Sizes в двух других полях. Эти размеры определяются реальными потребностями программы в динамической области. Если установить максимально возможный размер в 655360 байт(640К), то такая программа займет всю доступную оперативную память. По умолчанию минимальное значение динамической памяти равно 0.

Плавающие

границы

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Динамическая память

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Оверлейный буфер

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Сегмент стека

Сегмент данных

Сегмент кода модуля SYSTEM

Сегмент кода первого модуля программы

. . .

Сегмент кода последнего модуля программы

Сегмент кода главной программы

Рисунок 1

Карта распределения памяти является выходным документом компоновщика Linker и может быть сформирована при установке следующей опции среды ТР

Option/Linker/Map File/Segments.

К п.2. Динамические переменные не имеют имени. Для работы с ними введены специальные ссылочные типы, или указатели. По существу указатель - это адрес, начиная с которого динамическая переменная размещена в памяти.

Указатель связывается не с конкретной переменной, а с определенным типом данных. Для описания указателя используется знак ^”.

Пример описания

Type

IP = ^Integer; {тип указателя на целое}

P = ^Zap; {тип указателя на запись Zap}

Zap = record

...

end;

Var

Pointer1 : ^Char; {указатель на Char}

Pointer2 : ^Real; {указатель на Real}

В Турбо Паскале определена лишь одна операция над указателями - присваивание. Можно присвоить значение одного указателя другому указателю на тот же тип данных. Существуют также нетипизированные указатели, которые совместимы с указателями на любой тип. Для объявления переменной нетипизированным указателем нужно употреблять ключевое слово Pointer

Var

TypePointer: Pointer;

Значением нетипизированного указателя может являться либо адрес, либо NIL. NIL-специальное значение, обозначающее пустой указатель, который ни на что не указывает.

Для того, чтобы выделить место в куче под динамическую переменную, используется процедура NEW.

type

PE = ^Extended;

begin

...

New(PE);

...

end.

В приведенном примере в куче выделяется 10 байтов (в соответствии с размером типа Extended) и адрес начала этой области возвращается в указателе PE. Для обращения к полученной динамической переменной используется конструкция вида <имя указателя>^:

PE^:=3.1415;

PE^:=sqr(PE^);

Для освобождения динамической памяти используется процедура Dispose -