КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Процедуры работы с кучей
Типизированные (переменные) указатели Дерево 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;
Дата добавления: 2014-01-07; Просмотров: 244; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |