Лекция 8 Процедуры и функции для работы с — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Лекция 8 Процедуры и функции для работы с

2019-12-21 137
Лекция 8 Процедуры и функции для работы с 0.00 из 5.00 0 оценок
Заказать работу

Динамической памятью (1 час)

 

План

8.1 Процедуры и функции

Выделение и освобождение динамической памяти

 

Процедуры и функции

ADDR(x) –функция возвращает результат типа Pointer, в. котором содержится адрес аргумента. Здесь x – любой объект программы (имя любой переменной, процедуры, функции). Возвращаемый адрес совместим с указателем любого типа. Аналогичный результат возвращает операция @.

CSEG – функция возвращает значение, хранящееся в регистре CSмикропроцессора (в начале работы программы в регистре CSсодержится сегмент начала кода программы). Результат возвращается в слове типа Word.

Dispose(типизированный_указатель) – процедура возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за типизированным указателем. При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения.

DSEG функция возвращает значение, хранящееся в регистре DS микропроцессора (в начале работы программы в регистре DSсодержится сегмент начала данных программы). Результат возвращается в слове типа Word.

FreeMem(нетипизированный_указатель,size) – процедура возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за нетипизированным указателем. Здесь size длина в байтах освобождаемого фрагмента.

GetMem(нетипизированный_указатель,size) – процедура резервирует за нетипизированным указателем фрагмент динамической памяти требуемого размера.

Mark(PTR) – процедура запоминает текущее значение указателя кучи HeapPtr. Здесь PTR указатель любого типа, в котором будет возвращено текущее значение HeapPtr. Используется совместно с процедурой Releaseдля освобождения части кучи.

MaxAvail – функция возвращает размер в байтах наибольшего непрерывного участка кучи. Результат имеет тип LongInt.

MemAvail – функция возвращает размер в байтах общего свободного пространства кучи. Результат имеет тип LongInt.

New(типизированный_указатель) – процедура резервирует фрагмент кучи для размещения переменной. Процедура New может вызываться как функция. В этом случае параметром обращения к ней является тип переменной, размещаемой в куче, а функция New возвращает значение типа указатель. Пример:

Type

Pint=^Integer;

Var

p: Pint;

Begin

p:=New(Pint);

End.

QFS(x) – функция возвращает значение типа WORD, содержащее смещение адреса указанного объекта. Здесь x – выражение любого типа или имя процедуры.

PTR(SEG,OFS) – функция возвращает значение типа Pointerпо заданному сегменту SEGи смещению OFS. Здесь SEG выражение типа Word, содержащее сегмент; OFS— выражение типа WORD, содержащее смещение. Значение, возвращаемое функцией, совместимо с указателем любого типа.

RELEASE (PTR) – процедура освобождает участок кучи. Здесь PTR указатель любого типа, в котором предварительно было сохранено процедурой Markзначение указателя кучи. Освобождается участок кучи от адреса, хранящегося в PTR, до конца кучи. Одновременно уничтожается список всех свободных фрагментов, которые, возможно, были созданы процедурами Disposeили FreeMem.

SEG(x) – функция возвращает значение типа Word, содержащее сегмент адреса указанного объекта. Здесь x – выражение любого типа или имя процедуры.

SizeOf(x) – функция возвращает длину в байтах внутреннего представления указанного объекта. Здесь x – имя переменной, функции или типа.

 

Выделение и освобождение динамической памяти

Память под любую динамически размещаемую переменную выделяется процедурой New. Параметром обращения к этой процедуре является типизированный указатель. В результате обращения указатель приобретает значение, соответствующее динамическому адресу, начиная с которого можно разместить данные, например:

Var

i,j:^Integer;

r: ^Real;

Begin

New (i);

...

End.

После выполнения этого фрагмента указатель приобретет значение, которое перед этим имел указатель кучи HeapPtr, а сам HeapPtr увеличит свое значение на 2, так как длина внутреннего представления типа Integer, с которым связан указатель i, составляет 2 байта (на самом деле это не совсем так: память под любую переменную, выделяется порциями, кратными 8 байтам). Оператор

New(r);

вызовет еще раз смещение указателя HeapPtr, но теперь уже на 6 байт, потому что такова длина внутреннего представления типа RealАналогичным образом выделяется память и для переменной любого другого типа. После того, как указатель приобрел некоторое значение, т.е. стал указывать на конкретный физический байт памяти, по этому адресу можно разместить любое значение соответствующего типа. Для этого сразу за указателем без каких – либо пробелов ставится значок ^, например:

i^:= 2; {В область памяти i помещено, значение 2}

Таким образом, значение, на которое указывает указатель, т.е. собственно данные, размещенные в куче, обозначаются значком ^, который ставится сразу за указателем. Если за указателем нет значка ^, то имеется в виду адрес, по которому размещены данные.

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

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

Dispose (r);

Dispose (i);

вернут в кучу 8 байт, которые ранее были выделены указателям i и R. Процедура Dispose(PTR)не изменяет значения указателя PTR, а лишь возвращает в кучу память, ранее связанную с этим указателем. Освободившийся указатель можно пометить зарезервированным словом Nil. Помечен ли какой-либо указатель или нет, можно проверить следующим образом:

Const

р:^Rеаl=NIL;

Begin

If р=NIL then new(p);

Dispose(р);

р:= NIL;

End.

Никакие другие операции сравнения над указателями не разрешены.

Чередование обращений к процедурам New и Disposeобычно приводит к «ячеистой» структуре памяти, изображенной на следующей схеме:

Состояние динамический памяти после действия различных процедур.


Поделиться с друзьями:

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.01 с.