Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 2).doc
Скачиваний:
98
Добавлен:
15.04.2015
Размер:
2.24 Mб
Скачать
  1. Указатели и динамические переменные Статические и динамические переменные

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

Статические переменные в Турбо Паскале имеют следующие ограничения – их суммарный объем не может превышать 64 Кбайт. Вследствие этого, если для решения задачи требуются массивы данных больших размеров, то использование обычных (статических) переменных может привести к невозможности компиляции программы.

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

Адресация памяти в Турбо Паскале

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

В Турбо Паскале используется так называемый реальный режим адресации памяти. В этом режиме используются понятия: параграф, сегмент и смещение. Параграф – непрерывный участок памяти, состоящий из 16 байт, адрес которого кратен 16. Сегмент – непрерывный участок памяти, размер которого равен 65535 байтов (64 Кбайт), адрес сегмента также кратен 16 (говорят – адрес сегмента выровнен на границу параграфа). Смещение – номер конкретного байта в сегменте, то есть сдвиг данного байта относительно начала сегмента. В реальном режиме используется специальная нотация для представления адресов:

Segment:Offset

где Segment, Offset - целые положительные числа без знака, определяющие сегмент и смещение в значении адреса. При этом физический адрес определяется формулой: Address= Segment*l6+Offset.

Из того факта, что сегменты выравниваются по параграфам, следует, что один и тот же байт может иметь множество адресов в формате Segment:Offset. Действительно, имеет место равенство:

Segment:Offset=(Segment+k):(Offset-k*l6)=(Segment-k):(Offset+k*l6),

где kцелое число. Ограничения на значение k в указанном равенстве определяются тем, что по определению и сегментная составляющая, и смещение адреса не должны превышать 65535.

Карта памяти Турбо Паскаля

Распределение памяти для программы в Турбо Паскале показано на следующем рисунке.

Размеры стека и кучи определяются директивой компилятора

{$М StackSize, HeapMin, HeapMax}

где StackSizeцелая константа из диапазона 1024 .. 65520, определяющая размер стека программы в байтах;

HeapMinцелая константа из диапазона 0 .. 655360, определяющая минимально необходимый размер кучи;

НеарМах – целая константа из диапазона HeapMin .. 655360, определяющая максимально возможный (желательный) размер кучи.

Заметим, что значение HeapMin выражает жесткое требование на размер кучи, если при загрузке программы для нее не может быть создана куча размером не менее HeapMin, то программа не загружается вовсе. Значение НеарМах является факультативным требованием и определяет размер кучи при избытке свободной памяти ЭВМ. Если объем свободной памяти после загрузки основных частей программы составляет V байт, где Неар-Min<V<HeapMax, то весь этот объем выделяется под кучу.

Соседние файлы в папке WORD