русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Організація динамічної пам’яті


Дата додавання: 2014-04-22; переглядів: 947.


Вся динамічно розподілена пам’ять може розглядатися як суцільний масив, що складається з файлів і називається Heap-областю (купа). Heap-область розміщується в пам’яті комп’ютера вслід за областю пам’яті, яку займає тіло програми.

Нижня границя Heap-області визначається стандартною змінною-вказівником HeapOrg, яка містить абсолютну адресу початку динамічної пам’яті. Верхня границя Heap-област визначається вказівником HeapEnd. Поточне значення вказівника що розділяє зайняту й незайняту частину Heap-області, містить вказівник HeapPtr. При кожному новому виділенні пам’яті система управління Heap-областю пересуває вказівник HeapPtr вгору, в бік збільшення адрес пам’яті. При звільненні розподілених в динамічній пам’яті змінних відбувається зворотній процес., тобто вказівник зсувається вниз.

Об’ємом динамічної розподіленої пам’яті можна керувати за допомогою директиви компілятора {$M}. Її синтаксис: {$M розмір_стеку,розмір_динамічної_памяті}. Розмір стеку є числом в межах від 1024 до 65520, розмір динамічної пам’яті – від 0 до 655360. Ця директива при використанні в модулі користувача не впливає на компіляцію програми.

 

Процедура New

Процедура New(P), де P – змінна типу «вказівник», створює нову динамічну змінну того типу, на який посилається вказівник, і встановлює значення змінної Р таким чином, щоб воно вказувало на цю нову динамічну змінну:

VAR

P1: ^Integer;

P2: ^String;

 

Begin

New(P1);

New(P2);

….

End;

В цьому прикладі після виконання команди New(P1) вказівник Р1 дістає значення рівне тому, яке досі мав вказівник HeapPtr, а значення вказівника HeapPtr буде збільшене на 2, оскільки довжина внутрішнього представлення типу INTEGER, з яким зв’язаний вказівник Р1, дорівнює 2 байти. Оператор New(P2) викликає виділення блоку пам’яті довжиною 256 байтів і зміщення вказівника HeapPtrна цю ж величину вгору.

Якщо вказівник посилається на тип даних, для якого потрібно пам’яті більше, аніж доступно для розподілу в Heap-області, то в цьому випадку відбувається помилка виконання програми.

Процедура New може бути використана в якості функції, що повертає вказівник конкретного типу даних. Наприклад, якщо змінна P1 має тип даних, визначений як ^Integer, а змінна P1Int – тип даних Р1, то наступні два оператори

New(P1Int);

P1Int:=New(P1);

еквівалентні.

Після того, як вказівник здобув якесь значення, тобто став вазувати на конкретний фізичний байт пам’яті, то за цією адресою можна розмістити будь-яке значення відповідного типу даних

VAR

P1,P2:^Integer;

….

Begin

New(P1);

New(P2);

P1^:=7;

P1^:=7*4;

End.

 


<== попередня лекція | наступна лекція ==>
Нетипізовані вказівники | Процедура Dispose


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн