Понятие динамической памяти

Л Е К Ц И Я № 1

Контрольні запитання.

1. Сформулюйте теореми Ферма, Ролля і Лагранжа. Якій геометричний зміст вони мають?

2. Сформулюйте необхідну і достатню умову монотонності функції на інтервалі. Поясніть на прикладах.

3. Що називається екстремумом функції? Сформулюйте необхідну і достатню умову існування екстремума функції в певній точці.

 

 

по дисциплине «Программирование»

 

 

Тема: «Динамическая память и указатели»

 

 

План лекции:

 

1. Понятие динамической памяти.

2. Указатель и его назначение.

3. Процедуры и функции для работы с динамическими данными.

4. Динамически связанные данные.

 

 

Литература:

 

1. Беляева Т.А. и др. Алгоритмические языки программирования. Паскаль. – Севастополь: СНИЯЭиП, 2002 г.

2. Фаронов В.В. DELPHI.Программирование на языке высокого уровня: Учебник для вузов – СПб.: Питер, 2006.

3. Марченко А.И. Программирование в среде Borland Pascal 7.0.-К.:Юниор,1997.

 


Практика программирования часто выдвигает на передний план два конфликтующих фактора: время выполняемой программы и объем занимаемой памяти. Разумеется, высокое быстродействие программы всегда желательно, однако бывают случаи, когда очень важно обеспечить максимальную экономию памяти, даже ценой потери в скоростных характеристиках.

Пусть имеется некоторая программа, в которой применен целочисленный двумерный массив размером 300 элементов по каждому измерению:

Var a:array[1..300,1..300] of integer;

Один элемент матрицы - целое число занимает в памяти машины 2 байта. Общее количество элементов составляет 300*300=90 000, откуда следует оценка объема памяти, необходимой для размещения всего массива: 180 Кбайт. Нужно заметить, попутно, что в памяти также приходится размещать и программу пользователя, и компилятор, а также все переменные, используемые программой.

Вся оперативная память, выделяемая для работы программы, написанной на Паскале, делится на сегменты. Сегмент - это непрерывный участок памяти, размер которой не превышает 64 Кбайт.

Один сегмент всегда необходим для размещения главной программы.

Если программа имеет модульную структуру, то дополнительно по одному сегменту выделяется для каждого модуля. Кроме того, память обязательно выделяется под системный модуль System. Все эти сегменты носят название сегментов кода. Еще один сегмент необходим для размещения глобальных переменных и типизированных констант. К ним относятся переменные и константы, объявленные в главной программе и в секциях связей модулей. И, наконец, последним является сегмент стека, служащий в основном для размещения локальных данных подпрограмм и внутренних данных модулей. Сегменты программы располагаются в памяти в определенном порядке:

1. Динамическая память

2. Оверлейный буфер

3. Сегмент стека

4. Сегмент данных

5. Сегмент кода модуля System

6. Сегмент кода 1 модуля программы

7. Сегмент кода n-го модуля программы.

8. Сегмент кода последнего модуля

9. Сегмент кода главной программы

Вместе с тем маловероятно, чтобы при всяком выполнении программы ей действительно были нужны одновременно все элементы такого огромного массива. Обычно, когда программист описывает в программе массив большого размера, он поступает так "на всякий случай", чтобы быть готовым к возможному увеличению числа обрабатываемых элементов. При этом какая-то часть зарезервированного пространства пропадает впустую.

Вспомним программу, которая создавала базу данных по студентам класса. Там мы определяли сравнительно небольшой массив записей с данными (30 элементов). Предположим теперь, что нам надо создать базу для набора абитуриентов. Придется увеличивать размер массива. Но насколько? Допустим, сегодня будет достаточно 100 записей. А если завтра потребуется 1000, 5000 или того больше? Конечно, было бы верхом расточительности предусматривать массив из 5000 элементов, когда реально их нужно значительно меньше.

Идеальное решение проблемы экономного использования памяти состоит в том, чтобы вообще отказаться от структуры массива записей. Вместо этого следует, предварительно определив тип записи, создавать (посредством некоторого специального механизма) новый экземпляр записи всякий раз, когда в ней возникает потребность.

Упомянутый механизм называется динамическим распределением памяти, потому что ее суммарный объем в ходе выполнения программы постоянно изменяется (как в сторону увеличения, так и в сторону уменьшения). Ясно, что динамическое распределение способствует бережному расходованию памяти, хотя сами действия по резервированию и освобождению областей памяти, производимые во время исполнения программы, неизбежно снижают скорость.

Оставшаяся свободной после размещения сегментов область (по схеме распределения памяти) частично или полностью может быть занята динамической памятью.

Динамическая память –это оперативная память компьютера, предоставляемая ядром ОС программе по ее требованию.

Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы.

Статическое размещение осуществляется компилятором при компиляции программы.