Скачать презентацию Лекция 4 Динамические данные Распределение памяти при Скачать презентацию Лекция 4 Динамические данные Распределение памяти при

L4.pptx

  • Количество слайдов: 22

Лекция 4 Динамические данные Лекция 4 Динамические данные

Распределение памяти при компиляции • Статическое • Динамическое Распределение памяти при компиляции • Статическое • Динамическое

Статическое распределение На основании информации из раздела описаний и длины кода самой программы операционная Статическое распределение На основании информации из раздела описаний и длины кода самой программы операционная система во время работы программы выделяет определённый объём оперативной памяти, который закрепляется за программой на всё время её выполнения

Статическое распределение Const a: real=25. 369; Var MAS: array[1. . 200] of integer; I, Статическое распределение 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 PInt : ^Integer; PReal : ^Real; • Нетипизированные – Var P : Pointer;

Динамическое распределение • Память под динамически размещаемую переменную во время работы программы выделяется процедурой Динамическое распределение • Память под динамически размещаемую переменную во время работы программы выделяется процедурой (функцией) NEW. Процедура • New(Var <типизированный указатель>); • возвращает адрес выделенного участка памяти через параметр-переменную. Размер участка памяти определяется базовым типом указателя.

Динамическое распределение • Var PInt : ^Integer; PReal : ^Real; Begin New(PInt); New(PReal); PInt^ Динамическое распределение • 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, Динамическое распределение 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(<типизированный указатель>); освобождает память по адресу, хранящемуся в указателе. При Динамическое распределение Процедура • Dispose(<типизированный указатель>); освобождает память по адресу, хранящемуся в указателе. При этом не изменяется значение указателя Heap. Ptr – текущей границы незанятой динамической памяти. Поэтому чередование обращений к процедурам New и Dispose обычно приводит к фрагментации памяти – память разбивается на небольшие фрагменты с чередованием свободных и занятых участков.

Динамическое распределение При работе с нетипизированными указателями используются другие процедуры: Get. Mem(Var P : Динамическое распределение При работе с нетипизированными указателями используются другие процедуры: 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; Список type TPStudent = ^TStudent; TStudent = record f_name: string[20]; l_name: string[20]; next: TPStudent; end;

Операции над списком • Создание • Удаление • Добавление Операции над списком • Создание • Удаление • Добавление