11.3. Организация памяти области кучи
Для размещения динамических переменных используется область памяти, называемая «кучей». Место для данных в куче
- 198 -
отводится и освобождается только во время работы программы, и именно поэтому мы говорим о динамических данных. Место для прочих переменных отводится в специальном сегменте данных еще на этапе компиляции и не меняется впоследствии — это статические данные. Интересно, что сами ссылочные переменные являются статическими и располагаются в сегменте данных, но данные на которые они впоследствии ссылаются, как правило, организуются в куче.
На рис. 11.3 представлено распределение памяти области кучи при работе программ, написанных на Турбо Паскале. Куча первоначально всегда свободна и заполняется от нижних адресов в области кучи. Эта область характеризуется двумя предопределенными в языке указателями (переменными типа Pointer): HeapOrg и HeapPtr. Переменная HeapOrg указывает на начало кучи. Как видно из рис. 11.3, куча начинается сразу за оверлейным буфером. Если же программа не имеет оверлейных блоков, то куча начинается сразу за областью стека. Значение HeapOrg постоянно и, как правило, не меняется по ходу выполнения программы.
Переменная HeapPtr указывает на нижнюю границу свободного пространства в куче. Каждый раз, когда в куче размещается наверху новая динамическая переменная, этот указатель перемещается на размер переменной. При этом он нормализуется (приводится к виду СЕГМЕНТ:СМЕЩЕНИЕ) таким образом, что смещение находится в диапазоне от 0 до $F (15). Максимальный размер переменной, которая может быть размещена в куче равен 65520 байт, так как каждая переменная должна находится в одном сегменте и «оставлять» в нем 15 байтов.
Верхняя граница памяти MS-DOS
Рис. 11.3
- 199 -
Переменные HeapOrg и HeapPtr не стоит использовать в программах, пока не требуется распределять память кучи лучше, чем системные процедуры Турбо Паскаля. Но для опытных программистов, собирающихся производить «уборку мусора» и оптимизацию кучи, они могут быть полезны.