L4.pptx
- Количество слайдов: 22
Лекция 4 Динамические данные
Распределение памяти при компиляции • Статическое • Динамическое
Статическое распределение На основании информации из раздела описаний и длины кода самой программы операционная система во время работы программы выделяет определённый объём оперативной памяти, который закрепляется за программой на всё время её выполнения
Статическое распределение Const a: real=25. 369; Var MAS: array[1. . 200] of integer; I, j: byte; s: string
Статическое распределение памяти На основании этого описания будет зарезервировано следующее количество оперативной памяти: под константу типа real – 6 байтов; под массив – 400 байтов (200 элементов по 2 байта); под переменные i и j – по 2 байта; под переменную s – 256 байтов. Всего – 6+400+2+2+256=666 байт.
Динамическое распределение • В процессе работы программы специальной процедурой программист может запросить у системы некоторый объём памяти, а после использования (также специальной процедурой) возвратить её системе, т. е. динамическое управление памятью – это выделение памяти во время выполнения программы.
Динамическое распределение Преимущества: разумное использование динамических структур данных приводит к сокращению объёма памяти, необходимого для работы программы; динамические данные не требуют объявлений их как данных фиксированного размера; ряд алгоритмов более эффективен при реализации их с использованием динамических структур. Например, вставка элемента в массив на определенное место требует перемещения части элементов массива. При вставке в середину списка достаточно несколько операторов присваивания.
Динамическое распределение Недостатки: • алгоритмы для динамических структур обычно более сложны, трудны для отладки по сравнению с аналогичными для статических данных; • использование динамических структур требует затрат на память для ссылок. В некоторых задачах объём памяти, отводимой для ссылок, превосходит объём памяти, выделяемой непосредственно для данных; • существуют алгоритмы, реализация которых более эффективна на обычных данных.
Типы указателей • Типизированные – Var PInt : ^Integer; PReal : ^Real; • Нетипизированные – Var P : Pointer;
Динамическое распределение • Память под динамически размещаемую переменную во время работы программы выделяется процедурой (функцией) NEW. Процедура • New(Var <типизированный указатель>); • возвращает адрес выделенного участка памяти через параметр-переменную. Размер участка памяти определяется базовым типом указателя.
Динамическое распределение • Var PInt : ^Integer; PReal : ^Real; Begin New(PInt); New(PReal); PInt^ : = 2; PReal^ : = 2*pi; PReal^ : = Sqr(PReal^) + PInt^ - 1; End.
Динамическое распределение • После того, как указатель приобрел некоторое значение - адрес памяти, по этому адресу можно разместить любое значение соответствующего типа. Для доступа к данным, которые хранятся по этому адресу, необходимо за именем указателя поставить значок ^.
Динамическое распределение • Передавать значения между указателями можно в том случае, если они связаны с одним и тем же типом данных (либо один из них - нетипизированный указатель)
Динамическое распределение • Передавать значения между указателями можно в том случае, если они связаны с одним и тем же типом данных (либо один из них - нетипизированный указатель или "нулевой адрес" Nil ) • При выполнении операции присваивания теряется участок памяти, на который ссылался указатель стоящий слева от оператора присваивания. Это типичный случай создания "мусора" (garbage) в динамической памяти.
Динамическое распределение Type TType = (red, green, blue); PType = ^TType; Var P 1, P 2 : PType; PInt : ^Integer; P : Pointer; Begin New(P 1); New(P 2); P 1^ : = red; P 2^ : = green; P 1 : = P 2; . . . PInt : = P; P : = P 1; P 2 : = Nil; End.
Динамическое распределение Процедура • Dispose(<типизированный указатель>); освобождает память по адресу, хранящемуся в указателе. При этом не изменяется значение указателя Heap. Ptr – текущей границы незанятой динамической памяти. Поэтому чередование обращений к процедурам New и Dispose обычно приводит к фрагментации памяти – память разбивается на небольшие фрагменты с чередованием свободных и занятых участков.
Динамическое распределение При работе с нетипизированными указателями используются другие процедуры: Get. Mem(Var P : Pointer, Size : Word) {резервирование памяти} Free. Mem(P : Pointer, Size : Word) {освобождение памяти} • где Р – нетипизированный указатель, Size – размер в байтах требуемой или освобождаемой части кучи. • Использование процедур Get. Mem/Free. Mem (как и вообще вся работа с динамической памятью) требует особой осторожности и соблюдения правила: освобождать нужно ровно столько памяти, сколько ее было зарезервировано, и именно с того адреса, с которого она была зарезервирована.
Управление памятью • Проблемы: – Висячие ссылки - оставшаяся в использовании ссылка на объект, который уже удалён. – Утечки памяти
Управление памятью Сборщик мусора - специальный процесс, который периодически освобождает память, удаляя объекты, которые уже не будут востребованы приложениями Встроенный сборщик мусора: JAVA, Microsoft . NET
Динамические структуры данных • Линейный список – Односвязный – двусвязный
Список type TPStudent = ^TStudent; TStudent = record f_name: string[20]; l_name: string[20]; next: TPStudent; end;
Операции над списком • Создание • Удаление • Добавление


