Энциклопедия Turbo Pascal. Главы 1-4 - Глава 3. Динамическое распределение памяти

ОГЛАВЛЕНИЕ

Глава 3. Динамическое распределение памяти

Разработка программы для компьютера в некотором смысле напоминает процесс составления проекта здания,  включающий в  себя рассмотрение многочисленных функциональных и эстетических вопросов,  влияющих на окончательный результат.  Например,  некоторые программы имеют строгое функциональное назначение как дом,  который имеет определенное число спальных комнат,  кухню,  две ванные комнаты и т.д. Другие программы носят менее завершенный характер, как центры для проведения собраний,  которые имеют передвижные стены и модульные полы, позволяющие лучше приспособить здание для каждого конкретного случая. В этой главе описывается механизм управления памятью, позволяющий разрабатывать гибкие программы, которые могут адаптироваться к конкретным нуждам пользователя и возможностям ЭВМ.

Следует отметить,  что в этой главе используется термин "логический массив" и термин "физический массив".  Логический массив
- это такой массив,  который представляется существующим в системе.  Например, матрица на листе бумаги является логическим массивом.  Физический массив - это массив,  который в действительности имеется в вычислительной системе.  Связь между двумя этими массивами обеспечивается программами по поддержке разреженных массивов.  В этой главе рассматривается четыре метода создания разреженных массивов: посредством связанного списка, двоичного дерева, массива указателей и хеширования.  Затем будут даны примеры динамического распределения памяти, которое позволяет повысить производительность программы.

В программе на языке Паскаль информацию в  основной памяти ЭВМ можно хранить двумя способами.  Первый способ заключается в использовании глобальных или локальных переменных, включая массивы и записи,  которые предусмотрены в языке Паскаль.  Глобальные переменные занимают постоянное место в памяти во время выполнения программы.  Для локальных переменных память выделяется из стека ЭВМ. Хотя управление глобальными и локальными переменными на Паскале реализовано эффективно,  программист должен знать заранее объем необходимой памяти для каждого конкретного случая. Другой и более эффективный способ управления памятью на Паскале обеспечивается применением функций по динамическому управлению памятью.
Таким являются функции "New", "Dispose", "Mark" и "Release".

В обоих методах динамического управлению памятью память выделяется из свободного участка,  который не входит в постоянную область программы,  и стека /который используется в Паскале для хранения локальных переменных/. Эта область называется динамической (heap).

Рис.15 иллюстрирует структуру памяти для программы на языке Турбо Паскаль. Стек увеличивается в нижнем направлении. Объем памяти,  необходимой стеку,  зависит от характера программы. Например,  программа со многими рекурсивными функциями будет требовать много стековой памяти, поскольку при каждом рекурсивном обращении выделяется участок стековой памяти.  Участок выделяемой под программу и глобальные переменные памяти имеет постоянную величину и не изменяется во время выполнения программы.  Память для запросов функции "New" берется из свободного участка памяти, который начинается сразу после глобальных переменных и продолжается до стека.
В исключительных случаях может использоваться для стека область динамической памяти.

Старшие адреса памяти-------------------¬
                          ¦       Хип        ¦
                          ¦                  ¦
                          +------------------+
                          ¦                  ¦
                          ¦                  ¦
                          ¦      Стек        ¦
                          ¦                  ¦
                          +------------------+
                          ¦Глобальные перемен¦
                          +------------------+
                          ¦                  ¦
                          ¦                  ¦
                          ¦     Программа    ¦
                          ¦                  &brvbar.
Младшие адреса памятиL------------------

    Рис.15. Использование памяти в программе на языке Турбо Паскаль.

Использование динамической памяти зависит от того,  какая функция применяется для освобождения памяти и возвращения ее системе: функция "Dispose" или пара процедур "Mark" и "Release". Как указано в справочном руководстве по языку Турбо Паскаль,  эти два способа нельзя никогда смешивать в одной программе. Следовательно,  вам заранее необходимо решить, каким из способов пользоваться.  Для того,  чтобы понять,  чем эти способы отличаются друг от друга, ниже дается краткое описание этих функций.