Связывание идентификатора объекта с его — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Связывание идентификатора объекта с его

2021-03-18 78
Связывание идентификатора объекта с его 0.00 из 5.00 0 оценок
Заказать работу

     элементом хранения

 

Связывание – это определение взаимосвязи между идентификатором объекта (именем или указателем на объект) и элементом хранения объекта.

При идентификации именованием существует статическая связь между именем объекта и его элементом хранения (рис. 12).

                   

 

Рис. 12. Связывание при идентификации именованием

При идентификации указанием существует статическая связь между именем указателя и элементом хранения указателя. Между элементом хранения указателя и тем объектом, на который он указывает, устанавливается динамическая связь (рис.13).

 

 


Рис. 13. Связывание при идентификации указанием

Т.к. элемент хранения указателя содержит адрес объекта, в процессе выполнения программы один и тот же указатель может открывать доступ к различным объектам одного и того же типа (и атрибутам этих объектов).

 

Var op1, op2: Point; p: PPoint; Begin  
Op1.X:=10; op1.Y:=20; { заполнение атрибутов объекта op1 }
Op2.X:=100; op2.Y:=200; { заполнение атрибутов объекта op2 }
P:=@op1; { установка указателя p на объект op1 }    
Writeln(p^.X, p^.Y); { p^.X =10, p^.Y =20 }
P:=@op2; { установка указателя p на объект op2 }    
Writeln(p^.X, p^.Y); { p^.X =100, p^.Y =200 }

 

3. время жизни объекта. КЛАССЫ ПАМЯТИ

Понятие “времени жизни” объекта

 

Все объекты программы подразделяются на статические и динамические. Эти категории определяются через понятие “ времени жизни” объекта. Объекты, продолжительность существования которых равна времени выполнения программы, называют статическими, а объекты, время жизни которых меньше времени выполнения программы, - динамическими. С понятием времени жизни [ГНС2] объекта связаны его создание и уничтожение. Объекты, идентифицируемые именем, всегда являются статическими. Статические объекты создаются на этапе компиляции программы, до окончания работы программы для них сохраняется однозначное соответствие между элементом хранения объекта и именем объекта, по окончании работы программы они прекращают свое существование. Динамические объекты идентифицируются только через указатели, создаются и уничтожаются они в процессе выполнения программы.

 

Классы памяти

 

Распределение рабочего пространства оперативной памяти не является жестким, а происходит во время выполнения программы (см. рис. 14).

 

 

 


Рис. 14. Распределение рабочего пространства оперативной памяти

 

В нижних адресах располагаются системные программы. Выше располагается код исполняемого файла (файла с расширением.EXE), размер которого может превышать 64 К. Выполняемому файлу придается сегмент данных, размер которого не превышает 64 К. Далее располагается область системного стека, которая необходима для работы процедур и функций. Размер стека составляет не более 64 К. Стек заполняется от своей верхней границы по направлению к началу. Размер стека может быть назначен директивой $M. Выше стека располагается буфер для работы оверлеев – перекрывающихся частей программы. В верхних адресах оперативной памяти размещается куча (heap), необходимая для работы с динамическими объектами программы. Размером кучи пользователь может управлять при помощи директивы $M, которая имеет следующий формат:

 

{$M < stacksize >,< heapmin >,< heapmax > } – установить размеры памяти.

 

¨ < stacksize > - размер стека, изменяется от 1024 до 65520 байт;

¨ < heapmin > - минимальный размер динамической памяти, изменяется от 0

 до 655360 байт;

¨ < heapmax > - максимальный размер динамической памяти, изменяется от

< heapmin > до 655360 байт.

     Размеры памяти по умолчанию - {$M 16384,0,655360}.

 

Создание объекта следует рассматривать как выделение памяти под его элемент хранения. Согласно такому подходу рабочее пространство оперативной памяти подразделяется на три класса: статическая память, автоматическая память, динамическая память.

 

Статическая память

Статической памятью является сегмент данных размером не более 64 Кбайта, который выделяется каждой выполняемой программе. Элементы хранения объектов в статической памяти располагаются подряд в порядке их объявления в глобальной области программы.

 

Автоматическая память

Автоматическая память управляется директивами программы, связанными с вызовами процедур и их окончанием. Каждая процедура для своей работы требует индивидуальной локальной среды, которая называется фреймом активации процедуры. Фрейм активации включает значения фактических параметров, подставляемых на место формальных параметров, указанных в заголовке процедуры, значения локальных переменных, описываемых внутри процедуры, а также элемент хранения адреса возврата из процедуры. Фрейм активации однозначно характеризует процедуру, т.к. содержит набор объектов, необходимых для ее выполнения. Размещение локальной среды связано с активацией процедуры и происходит автоматически в момент ее вызова, а удаление локальной среды связано с пассивацией процедуры при завершении ее выполнения. В программе может одновременно существовать несколько активных процедур. Последовательность активации и пассивации процедур связана с вложенностью их вызовов. Поэтому управление автоматической памятью должно обеспечивать возможность корректного выполнения вызовов процедур в соответствии с дисциплиной “последним пришел – первым обслужен” (LIFO – Last Input First Output). Для этой цели наиболее подходящей является структура стека, и область автоматической памяти располагается именно в области системного стека. При активации каждой новой процедуры верхушка стека “опускается вниз” на величину, определяемую размером локальной среды данной процедуры. При пассивации процедуры верхушка стека “поднимается вверх” на эту же величину. 

Ниже для фрагмента программы приведена иллюстрация распределения статической и автоматической памяти (рис. 15). В глобальной области программы описаны две переменные: x и y. В статической памяти для переменной с именем x выделен элемент хранения размером Sizeof(WORD)=2(байта), в который в результате выполнения операции присваивания занесено значение 10, для переменной с именем y выделен элемент хранения размером Sizeof(REAL) = 6(байтов), значение которого будет неопределенным до завершения выполнения процедуры W1. Активация процедуры W1 приведет к созданию локальной среды, в которой будут размещены элементы хранения следующих объектов:

¨ значение фактического параметра x (2 байта), равное 10, подставляемого на место формального параметра x1: word, т.к. данный параметр передается по значению,

¨ указатель (4 байта) на фактический параметр y, подставляемый вместо формального параметра var y1: real, т.к. данный параметр передается по ссылке, значение указателя равно адресу переменной y в статической памяти,

¨ значение локальной переменной A: integer (2 байта),

¨ адрес возврата из процедуры (4 байта).

В процессе выполнения процедуры W1 происходит вызов процедуры W2. Активация процедуры W2 приведет к созданию локальной среды, в которой будут размещены элементы хранения следующих объектов:

¨ значение локальной переменной B: word (2 байта),

¨ адрес возврата из процедуры (4 байта).

Пассивация процедур W1, W2 и, соответственно, освобождение локальной среды каждой из них происходит в обратном порядке.

 

Var x: word; y: real;

 

 

Procedure W1 (x1: word; var y1: real);               Procedure W2;    

Var A: integer;                                                     Var B: word;

 begin                                                               begin

…                                                                …

W2;                                                             end;

end;

 

begin

x:=10; W1(x,y); writeln(y);

end.

 

 


Рис. 15. Распределение статической и автоматической памяти

Динамическая память

 

Динамическая память связана с созданием и уничтожением объектов по явному запросу из программы на выделение и освобождение памяти.

ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ДИНАМИЧЕСКОЙ ПАМЯТЬЮ.

Функция ADDR. Возвращает результат типа POINTER, в котором содержится адрес аргумента. Обращение:

ADDR(X),

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

 

     Процедура SIZEOF. Возвращает длину в байтах элемента хранения указанного объекта. Обращение:

SIZEOF (X  ),

где X – имя переменной или типа.

 

     Процедура NEW. Резервирует фрагмент кучи для размещения элемента хранения динамического обьекта программы. Обращение:

NEW (TP),

где TP – типизированный указатель. Размер элемента хранения определяется автоматически согласно размеру того типа, с которым связан типизированный указатель TP. За одно обращение к процедуре можно зарезервировать не более 65520 байт динамической памяти. В результате выполнения процедуры в куче размещается элемент хранения объекта, адрес первого байта которого занесен в указатель TP. Выделенная область памяти не инициализирована, программист должен занести в нее необходимые значения атрибутов объекта.

Пример:

 

Var p: PCircle;

 begin

new (p); p^.R:=5; p^.Center.X:=10; p^.Center.Y:=20; …

 

Динамически можно создавать объекты не только абстрактных, но и встроенных типов.

Пример:

 

Var pi: ^Integer;

begin

new(pi); pi^:= -100; …

 

Процедура GETMEM. Резервирует фрагмент кучи требуемого размера. Обращение:

GETMEM(P,SIZE),

где P – нетипизированный указатель, в который заносится адрес выделенной области памяти, SIZE – размер резервируемой памяти в байтах. За одно обращение к процедуре можно зарезервировать не более 65520 байт динамической памяти. Использование этой процедуры, как правило, связано с множественной интерпретацией области памяти, выполняемой при помощи маскирования (см. 5.2.5).

 

Процедура DISPOSE. Возвращает в кучу фрагмент динамической памяти, ранее связанный с типизированным указателем. Обращение:

DISPOSE (TP),

где TP – типизированный указатель, который должен быть установлен на реальный объект, т.е. не может быть равен NIL. Размер элемента хранения определяется автоматически согласно размеру того типа, с которым связан типизированный указатель TP. В результате выполнения процедуры фрагмент динамической памяти считается свободным, он не инициализируется, значение указателя не изменяется. Повторное применение этой процедуры к тому же самому указателю приведет к ошибке времени исполнения. Чтобы избежать подобных ошибок, можно инициализировать освободившийся указатель значением NIL.

     Пример:

Var p: PCircle; pi: ^Integer;

begin

new(p); new(pi); … dispose(p); p:=nil; dispose(pi); pi:=nil; …

 

Процедура FREEMEM. Возвращает в кучу фрагмент динамической памяти заданного размера. Обращение:

FREEMEM(P,SIZE),

где P – нетипизированный указатель, в котором находится адрес освобождаемой области памяти, SIZE – размер освобождаемой памяти в байтах. Все замечания относительно работы процедуры DISPOSE справедливы и для процедуры FREEMEM. Освобождать следует ровно столько памяти, сколько ранее было зарезервировано и именно с того адреса, с которого она была зарезервирована. Использование процедуры FREEMEM, как и GETMEM, также связано с множественной интерпретацией области памяти, выполняемой при помощи маскирования (см. 5.2.5).

 

     Функция MAXAVAIL. Возвращает размер в байтах наибольшего непрерывного участка кучи. Обращение:

MAXAVAIL.

Результат имеет тип LongInt. За один вызов процедуры NEW или GETMEM нельзя зарезервировать памяти больше, чем значение, возвращаемое этой функцией.

 

     Функция MEMAVAIL. Возвращает размер в байтах общего свободного пространства кучи кучи. Обращение:

MEMAVAIL.

Результат имеет тип LongInt.

 

Функции SEG и OFS. Возвращают значения типа WORD, содержащие соответственно сегмент и смещение адреса указанного объекта. Обращение:

SEG(X)

OFS(X),

где X – выражение любого типа или имя процедуры.

     Пример:

 

     Var pi: ^ Integer;

begin

     new(pi); pi^:=5; …

 

SEG(pi); { возвращает сегментную часть адреса, по которому расположен    указатель pi  }
SEG(pi^); { возвращает сегментную часть адреса, по которому расположен элемент хранения типа Integer }

 

Функция PTR. Возвращает значение указателя, которое формируется по заданному сегменту и смещению. Обращение:

PTR(SEG,OFS),

где SEG – выражение типа WORD, содержащее сегмент, OFS – выражение типа WORD, содержащее смещение. Значение, возвращаемое функцией, совместимо с указателем любого типа.

 

4. динамические структуры данных


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.045 с.