Процедуры работы с кучей

Типизированные ( переменные ) указатели

Дерево Absolute

Pointer

Работа с динамической памятью

Оперативная память компьютера представляет собой совокупность элементарных ячеек для хранения информации – байтов, каждый из которых имеет номер. Эти номера – адреса позволяют, обращается к любому байту.

Гибкое средство управление динамической памятью – указатель.

Указатель – Это переменная, которая в качестве своего значения содержит адрес байта памяти. Адрес задается двумя шестнадцатиразрядными словами (в двоичной СС).

Адрес = Сегмент : Смещение

Сегмент – это участок памяти, имеющий длину 64кб и начинающийся с адреса, кратного 16.

Смещение указывает, сколько байт от начала сегмента нужно пропустить, что бы обратится к нужному байту.

СА = сегмент*16+Сегмент (Стандартный адрес)

Сегмент = СА div 16

Смещение = СA mod 16

Виды памяти:

1) Куча(heap)

2) Стек

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

4) Рабочий код модуля

5) Служебная информация

Options/compile/memorysize

{$M…}

{$M, стек, тип Heap, max Heap}

По умолчанию: {$M. 16384.0.655360}

Стек: 0..65520

Min Heap : 0..655360

Max heap^ 0..655360

Var p:pointer;

Sizeof(pointer) = 4 байта

Pointer = Сегмент:Смещение (word:word)

P:=nil (Нулевой адрес)

Операции с pointer:

1) P:=q;

2) P<>Q или p=q

3) Нельзя read И write

4) P^ - операция разыменования. Позволяет обратиться к значению по адресу P. (x:=p^)

5) P:=@x - Берется адрес переменной x

6) Addr(x):pointer. @x=addr(x)

7) Function seg(x):word ( возвращает сегмент)

8) Function ofs(x):word (Возвращает смещение)

9) Function ptr(s,o:word):pointer (Возвращает адрес по заданному смещению и сегменту)

 

Var memory:word absolute $1004:$0000;

St:string[30];

Stlen:byte absolute st;

A:integer;

B: array [1..10] of byte absolute a;

{absolute позволяет разместить переменную по заданному адресу}

Begin

Memory:=16;

St:=’123456789a’

Stlen:=5;

Writeln(st); {выведет ‘12345’, ибо мы ограничили переменной stlen=5 размер который выделится для стринга}

End;

 

Ссылочный тип= ^базовый тип

Type mass=array[1..100] of byte;

Var

pInt:^integer;

pbyte:^byte;

pmass:^mass

begin

pint^:=5;

pbyte^:10;

pmass^[pint^]:=pbyte^;

1) New(p) – резервирует в динамической памяти свободный участок для размещения динамической переменной. В параметр Р превращается указатель на данный участок памяти. (new работает с типизированными указателями)

2) Getmem(p:pointer; size:word) – резервирует участок размера size в байтах

3) Dispose(p:pointer) - освобождает участок памяти на который указывает Р

4) Freemam (P:pointer; size:word) – освобождает память по адресу P объемом size

5) Procedure mark(p:pointer); - запоминает текущее значение указателя, но память под указатель не резервируется

6) Procedure relean (p:pointer); - Позволяет освободить кучу от указателя Р (запомненного с помощью mark(p)) и до конца.

7) Function maxavail:longint – возвращает размер в байтах максимального свободного участка памяти

8) Function memavail:longint – Возвращает суммарный объем всех свободных участков куч.

Var x:^Boolean;

Y:Boolean;

Begin

New(x);

X^:=true;

Y:=not x^;

Dispose(x);

Rwiteln(y);

End;