- •Динамічний розподіл пам’яті Статичні і динамічні змінні
- •Покажчики Поняття покажчика
- •Розподіл динамічної пам’яті Породження динамічних об'єктів
- •Доступ до динамічних об'єктів
- •Обробка динамічних об'єктів
- •Знищення динамічних об'єктів
- •Методи динамічного розподілу пам’яті
- •Стандартні засоби аналізу стану Heap-області
- •Динамічний розподіл пам’яті
- •Динамічні структури даних
ПЛАН
ДИНАМІЧНИЙ РОЗПОДІЛ ПАМ’ЯТІ 1
Статичні і динамічні змінні 1
Покажчики 2
Поняття покажчика 2
Розподіл динамічної пам’яті 4
Породження динамічних об'єктів 4
Доступ до динамічних об'єктів 5
Обробка динамічних об'єктів 5
Знищення динамічних об'єктів 6
Методи динамічного розподілу пам’яті 6
Стандартні засоби аналізу стану Heap-області 8
Динамічний розподіл пам’яті 9
Динамічні структури даних 10
Списки 10
Дерева 11
Динамічний розподіл пам’яті Статичні і динамічні змінні
Усі розглянуті дотепер програмні об'єкти мали дещо спільне:
-
породжувалися вони (виділялася під них пам'ять) перед виконанням програми;
-
існували в пам’яті комп’ютера протягом всього часу виконання програми,
-
розмір їх значень (у сенсі обсягу машинної пам'яті, необхідної для їх розміщення) протягом виконання програми залишався незмінним.
Такі програмні об'єкти і відповідні їм змінні вважаються в програмуванні статичними (постійними в ОП).
Статичні змінні – це змінні, пам'ять під які виділяється на етапі компіляції і не змінюється в процесі виконання програми.
Статичні об'єкти породжуються за допомогою відповідних оголошень. Наприклад, у мові Pascal опис змінної m у розділі змінних var виду
m:=аrray[1..20] of real;
свідчить про те, що в програмі породжується статична змінна регулярного типу (масив), значенням якої може бути упорядкована послідовність із двадцяти дійсних чисел. Пам'ять під статичні об'єкти виділяється в сегменті даних образу .exe- файлу програми.
Доступ до відповідних областей пам’яті (статичних об'єктів) у програмі здійснюється за іменами (ідентифікаторами) відповідних змінних. При цьому на машинній мові посилання на програмний об’єкт здійснюється шляхом вказання його місця в пам’яті комп’ютера, тобто адреси комірки пам'яті, починаючи з якої цей об’єкт розміщений в пам'яті.
Оскільки статичні об'єкти породжуються до виконання програми і розмір їх значень відомий заздалегідь, то місце в пам'яті комп’ютера, необхідне для зберігання їх значень, виділяється на етапі трансляції програми. Вся робота з розміщення таких об'єктів у пам'яті та формуванню посилань на ці об'єкти в машинній програмі здійснюється транслятором.
Проте використання при програмуванні лише статичних об'єктів не завжди дозволяє отримувати ефективні машинні програми, що буває надзвичайно важливим при вирішенні ряду задач. Справа у тому, що іноді на етапі написання програми не тільки не відомий розмір конкретного програмного об’єкта, але й те чи буде він існувати взагалі. Окрім того, у версіях систем програмування, що працюють під операційною системою MS-DOS, обсяг сегмента даних, що служить для розміщення статичних змінних, обмежений (64 Кб). При необхідності роботи з великими масивами інформації цього може виявитися недостатньо, особливо коли відомо, що вони потрібні не на увесь час виконання програми, а тільки на якусь незначну його частину.
Тому у мовах програмування існує й інший спосіб виділення пам'яті під дані, який називається динамічним.
Динамічні змінні - це змінні, пам'ять під які виділяється та звільняється в міру необхідності в процесі виконання програми.
Якщо наприклад, в заданому тексті, що складається із слів довільної довжини, потрібно знайти перше по порядку слово, що має певну ознаку, то змінна, значенням якої є шукане слово, в процесі виконання програми може взагалі не з'явитися (якщо в тексті немає жодного слова із заданою властивістю), а якщо вона і з'явиться, то заздалегідь невідома довжина слова, що є значенням цієї змінної. Отже, така змінна по своїй суті є динамічним програмним об'єктом.
В цьому випадку можна було обійтися використанням лише статичних змінних. Але тоді для змінної-результату довелося б відвести місце в пам'яті з розрахунку на максимально можливу довжину слова (описавши відповідним чином цю змінну), що може привести до нераціонального використання пам'яті комп’ютера.
Розміщуються динамічні змінні у спеціальній області ОП, яку називають динамічною пам’яттю (купою, Heap-областю). Розмір динамічної пам'яті - фактично уся вільна ОП (сотні кілобайт). Організована вона подібно стеку, але заповнення її йде від нижніх адрес до верхніх (рис. 1).
Старші адреси |
Системні програми |
Покажчики |
|
Вільна (не розподілена) пам'ять |
HeapEnd |
|
Динамічна пам'ять (росте нагору ) |
HeapPtr HeapOrg |
16 Кб
|
Сегмент стека (росте вниз ) |
Sseg:SPtr (SP) |
|
Вільна пам'ять стека |
Sseg:0000 (SS) |
64 Кб |
Сегмент даних основної програми |
DSeg:0000(DS) |
|
Сегмент коду модуля System |
СSeg:0000(СS) |
64 Кб |
Сегмент коду модуля 1 |
образ |
|
. . . |
.exe- файлу |
64 Кб |
Сегмент коду модуля N |
|
64 Кб |
Сегмент коду основної програми |
|
256 байт |
PSP (префікс основної програми) |
PrefixSeg |
Молодші адреси |
Turbo Pascal |
|
Рис. 1. Карта розподілу ОП при роботі програми
Використання динамічних об'єктів надає програмісту ряд додаткових можливостей. По-перше, використання динамічної пам'яті дозволяє суттєво збільшити обсяг оброблюваної інформації. По-друге, якщо потреба в якихось даних відпала до закінчення програми, то зайняту ними пам'ять можна звільнити для іншої інформації. По-третє, використання динамічної пам'яті дозволяє створювати структури даних змінного розміру.