Процедуры работы с кучей
Типизированные ( переменные ) указатели
Дерево 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;