Page 49 - 4761
P. 49
n
V ( m ) V ,
мас i ел
i 1
n – розмірність масиву, m - кількість елементів і-го розміру,
i
V – об’єм пам’яті для одного елемента;
ел
- для структур – сума розмірів пам’яті максимального поля в об’єднанні
V V ,
стр поля( i)
i n,1
n – загальна кількість полів в структурі;
V – об’єм пам’яті для і-го поля структури;
поля (i )
- для об’єднань (союзів, спільних областей, записів з варіантами) – розмір
максимального поля в об’єднанні,
max
V V
об . поля (і )
i , 1 n
n – загальна кількість полів в об’єднанні;
V – об’єм пам’яті для і-го поля об’єднання;
поля (i )
- для реалізації об’єктів(класів) – розмір пам’яті для структури з такими ж
іменованими інфраструктурою ООН (як правило, фіксованого об’єму).
Для більш складних структур даних вхідної мови об’єм пам’яті, який відводиться
під ці структури даних обчислюються рекурсивно.
Далеко не всі лексичні одиниці мови вимагають для себе виділення пам’яті.
Під які елементи виділяти пам'ять, а під які ні, визначається виключно реалізацією
компілятора і архітектурою обчислювальної системи. Так, цілочислові константи можна
розмістити в статичній пам’яті, а можна і безпосередньо в тексті результуючої програми.
Пам'ять можна поділити на локальну і глобальну, динамічну і статичну.
Статична область пам’яті, розмір якої відомий на етапі компіляції. Оскільки для
статичної області пам’яті відомо її розмір, компілятор завжди може виділити цю область
пам’яті і зв’язати її з відповідним фрагментом програми. Тому для статичної пам’яті
компілятор породжує деяку адресу (як правило, відносну). В статичну пам'ять попадає
більшість змінних та констант вхідної мови.
Статичні області пам’яті обробляються компілятором самим простим чином, точки
яких зв’язані зі своєю адресою.
Динамічна пам'ять – це область пам’яті, розмір якої на етапі компіляції невідомо.
В цьому випадку компілятор породжує фрагмент коду, який відповідає за розподіл
пам’яті (її виділення та звільнення).
З динамічною пам’яттю пов’язані операції з вказівниками та з об’єктами (класами).
Динамічну пам’ять можна поділити на: динамічну пам’ять, яку виділяє користувач,
і динамічну пам’ять, яку виділяє компілятор.
Динамічна пам’ять, яку виділяє користувач, з’являється в тих випадках, коли
розробник явно використовує в тексті програми функції, пов’язані з розподілом пам’яті
(malloc і free в C, new, delete в C++).
В одному випадку робота компілятора з такою пам’яттю нічим не відрізняється від
роботи з любими другими функціями і додаткових складностей не викликає.
Динамічна пам’ять, яку виділяє компілятор, з’являється тоді, коли користувач
використовує типи даних, операції над якими передбачають перерозподіл пам’яті,
відсутній в явному виді в тексті вхідної програми. Наприклад, рядки в деяких мовах
програмування, динамічні мови, операції над об’єктами (типу string в Borland Delphi мови
Object Pascal). В цьому випадку сам компілятор відповідає за породження коду, який буде
завжди забезпечувати своєчасне виділення пам'яті під елементи програми, і за звільнення
її по мірі використання.
Як динамічна, так і статична пам'яті можуть бути і глобальними і локальними.
47