Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Топ:
Определение места расположения распределительного центра: Фирма реализует продукцию на рынках сбыта и имеет постоянных поставщиков в разных регионах. Увеличение объема продаж...
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Дисциплины:
2019-12-21 | 143 |
5.00
из
|
Заказать работу |
|
|
Динамической памятью (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обычно приводит к «ячеистой» структуре памяти, изображенной на следующей схеме:
Состояние динамический памяти после действия различных процедур.
|
|
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!