Динамическая память – исключительно важное свойство, позволяющее создавать "гибкие" программы, способные работать с данными заранее неизвестного размера. Прежде чем переходить к работе с динамической памятью и динамическими переменными, следует рассмотреть, каким образом в памяти размещаются обычные (статические) переменные, создаваемые оператором VAR.
Итак, что делает оператор VAR? Посмотрим на Рис. 9.1.
Рис. 13.1. Статические переменные.
Программа, написанная на Delphi, компилируется в exe-файл. Внутри него находятся не только коды команд процессора, но и сегмент данных – последовательности байтов, соответствующие всем описанным в программе переменным. Например, если в программе есть оператор VAR x:WORD, то где-то внутри exe-файла будут зарезервированы два байта для хранения значения переменной x. При введении в программу "больших" переменных (например, типа STRING) легко заметить соответствующее увеличение размера exe-файла.
Зачем в exe-файле резервируется место под переменные? Конечно, не для того, чтобы их туда записывать во время работы программы. Exe-файл – вещь неприкосновенная. Windows прямо запрещает внесение изменений в запущенный exe-файл. Дело в том, что перед выполнением программы весь exe-файл считывается и размещается в оперативной памяти. "Пустышки", заготовленные в exe-файле, теперь размещены в оперативной памяти и автоматически превратились в "коробочки" для хранения всех используемых в программе переменных. Так просто и изящно решен вопрос с выделением памяти под статические переменные.
Описанный способ имеет два крупных недостатка: во-первых, растет размер exe-файла. Во-вторых, размер оперативной памяти современных компьютеров составляет 512Мб..1Гб. Если нужно использовать хотя бы 100Мб, пришлось бы писать exe-файл размером свыше 100Мб, что совершенно нереально. В-третьих, и это еще более существенно, во время выполнения программы (время выполнения называется run-time в отличие от времени программирования и отладки, известного как design-time) оказывается невозможным изменить размер статической переменной. Описали массив на 20 чисел – никаким образом превратить его в массив на 25 чисел не удастся. Оно и понятно – размер exe-файла постоянен, его не изменить. Соответственно мы заранее должны знать, сколько ячеек памяти отводить под все используемые в программе данные. Все обычные переменные в программе – статические. Их размер задается программистом и не может быть изменен. Нельзя создать массив из заранее неизвестного числа компонентов.
Подобное ограничение не просто затрудняет работу, но делает попросту невозможным решение очень широкого круга задач. Представьте себе текстовый редактор, способный редактировать ровно 10 страниц текста, а потом у него "память кончается". Спасение заключается в оригинальном механизме образования переменных "на ходу", динамически.