Работа с динамической памятью и указателями в системе Turbo Pascal. Мирецкий И.Ю - 4 стр.

UptoLike

Составители: 

Сегмент данных (адресуемый через DS) содержит все глобальные переменные и затем все типи-
зованные константы. Регистр DS никогда не изменяется во время выполнения программы. Размер сегмента
данных не может превышать 64К.
При запуске программы регистр сегмента стека (SS) и указатель стека (SP) устанавливаются так,
что SS:SP указывает на первый байт после сегмента стека. Регистр SS никогда
не изменяется во время вы-
полнения программы, а SP может передвигаться вниз пока не достигнет конца сегмента. Размер стекового
сегмента не может превышать 64К; размер по умолчанию - 16К, он может быть изменен директивой ком-
пилятора $M.
Буфер оверлеев используется стандартным модулем Overlay для хранения оверлейного кода. Раз-
мер оверлейного буфера по умолчанию соответствует
размеру наибольшего оверлея в программе; если в
программе нет оверлеев, размер буфера оверлеев равен 0. Размер буфера оверлеев может быть увеличен с
помощью вызова программы OvrSetBuf модуля Overlay; в этом случае размер кучи соответственно
уменьшается, смещением вверх HeapOrg.
Куча занимает всю или часть свободной памяти, оставшейся после загрузки программы. Факти-
чески размер кучи зависит
от минимального и максимального значений кучи, которые могут быть ус-
тановлены директивой компилятора $M. Размер кучи никогда не будет меньше минимального значения и
не превысит максимального. Если в системе нет памяти равного минимальному значению, программа не
будет выполняться. Минимальное значение кучи по умолчанию равно 0 байт, максимальное - 640К; это
означает, что по
умолчанию куча будет занимать всю оставшуюся память.
Управление кучей осуществляет монитор кучи (который является частью библиотеки Turbo Pascal).
Динамическая память (куча) используется для размещения динамических переменных. Динамиче-
ское размещение данных означает использование памяти непосредственно при работе программы. При
динамическом размещении заранее не известны ни тип, ни количество размещаемых данных. Созданием и
уничтожением
динамических переменных управляет программист.
К статическим переменным можно обратиться по идентификаторам. Для динамических перемен-
ных такой способ доступа непригоден. Единственным средством доступа к ним является указатель на место
их текущего расположения в памяти.
2. Тип указатель
Тип указатель определяет множество значений, которые указывают на динамические переменные
определенного типа, называемого базовым
типом. Реально значения указателей содержат адреса рас-
положения в памяти конкретных значений базового типа.
Если базовый тип является еще не объявленным идентификатором, то он должен быть объявлен в
той же самой части объявления, что и тип указатель.
Рассмотрим следующий пример:
type
Buffer = string[255];
BufPtr = ^Buffer;
var
Buf1: Buffer;
Buf2: BufPtr;
Тип данных Buffer определен как строковая переменная размером 255 байт; BufPtr -
указатель на
Buffer. Переменная Buf1 имеет тип Buffer и занимает (255+1) байт памяти. Переменная Buf2 имеет тип
BufPtr и, являясь 32-битовым адресом, занимает 4 байта памяти.
Прежде чем использовать BufPtr, необходимо зарезервировать память и запомнить ее адрес в Buf2.
Для этого используется процедура New, которая отводит новую область памяти в куче для динамической
переменной и сохраняет адрес этой области
в переменной указателе.
тип указатель ^ базовый тип
базовый тип идентификатор типа
        Сегмент данных (адресуемый через DS) содержит все глобальные переменные и затем все типи-
зованные константы. Регистр DS никогда не изменяется во время выполнения программы. Размер сегмента
данных не может превышать 64К.
        При запуске программы регистр сегмента стека (SS) и указатель стека (SP) устанавливаются так,
что SS:SP указывает на первый байт после сегмента стека. Регистр SS никогда не изменяется во время вы-
полнения программы, а SP может передвигаться вниз пока не достигнет конца сегмента. Размер стекового
сегмента не может превышать 64К; размер по умолчанию - 16К, он может быть изменен директивой ком-
пилятора $M.
        Буфер оверлеев используется стандартным модулем Overlay для хранения оверлейного кода. Раз-
мер оверлейного буфера по умолчанию соответствует размеру наибольшего оверлея в программе; если в
программе нет оверлеев, размер буфера оверлеев равен 0. Размер буфера оверлеев может быть увеличен с
помощью вызова программы OvrSetBuf модуля Overlay; в этом случае размер кучи соответственно
уменьшается, смещением вверх HeapOrg.
        Куча занимает всю или часть свободной памяти, оставшейся после загрузки программы. Факти-
чески размер кучи зависит от минимального и максимального значений кучи, которые могут быть ус-
тановлены директивой компилятора $M. Размер кучи никогда не будет меньше минимального значения и
не превысит максимального. Если в системе нет памяти равного минимальному значению, программа не
будет выполняться. Минимальное значение кучи по умолчанию равно 0 байт, максимальное - 640К; это
означает, что по умолчанию куча будет занимать всю оставшуюся память.
        Управление кучей осуществляет монитор кучи (который является частью библиотеки Turbo Pascal).
        Динамическая память (куча) используется для размещения динамических переменных. Динамиче-
ское размещение данных означает использование памяти непосредственно при работе программы. При
динамическом размещении заранее не известны ни тип, ни количество размещаемых данных. Созданием и
уничтожением динамических переменных управляет программист.
        К статическим переменным можно обратиться по идентификаторам. Для динамических перемен-
ных такой способ доступа непригоден. Единственным средством доступа к ним является указатель на место
их текущего расположения в памяти.


                                         2. Тип указатель
       Тип указатель определяет множество значений, которые указывают на динамические переменные
определенного типа, называемого базовым типом. Реально значения указателей содержат адреса рас-
положения в памяти конкретных значений базового типа.

тип указатель                  ^                        базовый тип


базовый тип                        идентификатор типа


        Если базовый тип является еще не объявленным идентификатором, то он должен быть объявлен в
той же самой части объявления, что и тип указатель.
        Рассмотрим следующий пример:

                type
                       Buffer = string[255];
                       BufPtr = ^Buffer;
                var
                       Buf1: Buffer;
                       Buf2: BufPtr;

         Тип данных Buffer определен как строковая переменная размером 255 байт; BufPtr - указатель на
Buffer. Переменная Buf1 имеет тип Buffer и занимает (255+1) байт памяти. Переменная Buf2 имеет тип
BufPtr и, являясь 32-битовым адресом, занимает 4 байта памяти.
         Прежде чем использовать BufPtr, необходимо зарезервировать память и запомнить ее адрес в Buf2.
Для этого используется процедура New, которая отводит новую область памяти в куче для динамической
переменной и сохраняет адрес этой области в переменной указателе.