ВУЗ:
Составители:
Рубрика:
1. Введение. Статические и динамические переменные
Все переменные, объявленные в программе, размещаются в одной непрерывной области опера-
тивной памяти, которая называется сегментом данных. Длина сегмента данных составляет 64К.
Для локальных переменных, описанных в подпрограмме, память отводится при вызове подпро-
граммы. При выходе из нее эта память освобождается, а сами переменные
прекращают свое существова-
ние. Глобальным переменным программы память отводится в начале ее выполнения. Эти переменные су-
ществуют в течение всего периода работы программы. Переменные, память под которые распределяется
описанным образом, называются статическими. Использование одних лишь статических переменных ли-
шает возможности писать программы, обрабатывающие достаточно большие информационные массивы.
Turbo Pascal дает возможность программисту
использовать для размещения переменных так назы-
ваемую "кучу" (heap) - динамическую память. Чтобы оценить размер и положение кучи в оперативной па-
мяти компьютера, рассмотрим карту памяти Turbo Pascal (см. рис. 1).
Префикс сегмента программы (Program Segment Prefix - PSP) -это 256-ти байтовая область, созда-
ваемая DOS при загрузке программы. Адрес сегмента PSP хранится в переменной PrefixSeg.
Каждый модуль (и главная программа, и каждый
модуль) имеет свой кодовый сегмент. Главная
программа занимает первый кодовый сегмент; кодовые сегменты, которые следуют за ним, занимают мо-
дули (в порядке, обратном тому, как они следовали в операторе uses), и последний кодовый сегмент за-
нимает библиотека времени выполнения (модуль System). Размер одного кодового сегмента не может
превышать 64К, но общий размер
кода ограничен только имеющейся памятью.
Верхняя граница памяти DOS
HeapEnd
свободная память
HeapPtr
куча (растет вверх)
HeapOrg OvrHeapEnd
оверлейный буфер
OvrHeapOrg
стек (растет вниз)
SSeg:SPtr
свободный стек
SSeg:0000
глобальные переменные
типизованные константы
DSeg:0000
кодовый сегмент модуля System
кодовый сегмент первого модуля
кодовый сегмент других модулей содержат образ
.EXE - файла
кодовый сегмент последнего
модуля
кодовый сегмент главной программы
префикс сегмента программы (PSP)
PrefixSeg
Нижняя граница памяти DOS
Рис. 1. Распределение памяти в Turbo Pascal.
1. Введение. Статические и динамические переменные Все переменные, объявленные в программе, размещаются в одной непрерывной области опера- тивной памяти, которая называется сегментом данных. Длина сегмента данных составляет 64К. Для локальных переменных, описанных в подпрограмме, память отводится при вызове подпро- граммы. При выходе из нее эта память освобождается, а сами переменные прекращают свое существова- ние. Глобальным переменным программы память отводится в начале ее выполнения. Эти переменные су- ществуют в течение всего периода работы программы. Переменные, память под которые распределяется описанным образом, называются статическими. Использование одних лишь статических переменных ли- шает возможности писать программы, обрабатывающие достаточно большие информационные массивы. Turbo Pascal дает возможность программисту использовать для размещения переменных так назы- ваемую "кучу" (heap) - динамическую память. Чтобы оценить размер и положение кучи в оперативной па- мяти компьютера, рассмотрим карту памяти Turbo Pascal (см. рис. 1). Верхняя граница памяти DOS HeapEnd свободная память HeapPtr куча (растет вверх) HeapOrg OvrHeapEnd оверлейный буфер OvrHeapOrg стек (растет вниз) SSeg:SPtr свободный стек SSeg:0000 глобальные переменные типизованные константы DSeg:0000 кодовый сегмент модуля System кодовый сегмент первого модуля кодовый сегмент других модулей содержат образ .EXE - файла кодовый сегмент последнего модуля кодовый сегмент главной программы префикс сегмента программы (PSP) PrefixSeg Нижняя граница памяти DOS Рис. 1. Распределение памяти в Turbo Pascal. Префикс сегмента программы (Program Segment Prefix - PSP) -это 256-ти байтовая область, созда- ваемая DOS при загрузке программы. Адрес сегмента PSP хранится в переменной PrefixSeg. Каждый модуль (и главная программа, и каждый модуль) имеет свой кодовый сегмент. Главная программа занимает первый кодовый сегмент; кодовые сегменты, которые следуют за ним, занимают мо- дули (в порядке, обратном тому, как они следовали в операторе uses), и последний кодовый сегмент за- нимает библиотека времени выполнения (модуль System). Размер одного кодового сегмента не может превышать 64К, но общий размер кода ограничен только имеющейся памятью.