Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Виділення і вивільнення динамічної пам’ятіСодержание книги
Поиск на нашем сайте Організація динамічної пам’яті Вся динамічно розподілена пам’ять може розглядатися як суцільний масив, що складається з файлів і називається 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 Динамічну пам’ять можна не тільки розподіляти, але й вивільняти. Процедура Dispose(P), де P – змінна типу «вказівник», знищує динамічну змінну, на яку вказує вказівник Р. Кожен повторний виклик оператора New повинен попереджатися викликом оператора Dispose. Ця процедура не міняє значення вказівника Р, а тільки повертає в купу пам’ять, раніше зв’язану з цим вказівником. При цьому повторне використання процедури до вільного вказівника призведе до помилки часу виконання. Для уникнення такої помилки звільнений вказівник можна помітити зарезервованим словом NIL.
Dispose(P); Dispose(Nil);
Підсумок Крім звичайних змінних, пам’ять для яких виділяється ще в процесі компіляції, існують також динамічні, які створюються і знищуються під час роботи програми. Щоб користуватися такими зміннми, слід використовувати вказівники. Вказівники бувають типізованими і нетипізованими. З ними можлива операція розіменування. Для створення нової змінної динамічного типу використовується процедура New(), для знищення – Dispose().
Питання по темі 1. Який Pascal-оператор дає змогу визначити адресу змінної? а) ADDR б)@ в)
2. Який стандартний тип описує нетипізований вказівник 3. Яка директива компілятора керує об’ємом динамічної розподіленої пам’яті? а) {$F} б) {$K} в) {$M}
4. Яка процедура створює нову динамічну змінну? 5. Яка процедура знищує динамічну змінну?
|
||
|
Последнее изменение этой страницы: 2021-12-15; просмотров: 98; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.006 с.) |