Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота5.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
138.24 Кб
Скачать

Вирівнювання меж областей пам'яті

Говорячи про об'єм пам'яті, займаної різними лексичними одиницями і структурами даних мови, слід згадати ще один момент – вирівнювання меж областей пам'яті, що відводяться для різних лексичних одиниць.

Архітектура багатьох сучасних обчислювальних систем передбачає, що обробка даних виконується ефективніше, якщо адреса, по якій вибираються дані, кратна певному числу байт (як правило, це 2, 4, 8 або 16 байт). Сучасні компілятори враховують особливості цільових обчислювальних систем. При розподілі даних вони можуть розміщувати області пам'яті під лексичні одиниці найбільш оптимальним чином. Оскільки не завжди розмір пам'яті, що відводиться під лексичну одиницю, кратний вказаному числу байт, то в загальному об'ємі пам'яті, що відводиться під результуючу програму, можуть з'являтися невживані області.

Наприклад, якщо ми маємо опис змінних на мові C:

static char c1, c2, c3;

то, знаючи, що під одну змінну типу char відводиться 1 байт пам'яті, можемо чекати, що для описаних вище за змінні буде потрібно всього 3 байти пам'яті. Проте якщо кратність адрес для доступу до пам'яті встановлена 4 байти, то під ці змінні буде відведено в цілому 12 байт пам'яті, з яких 9 не використовуватимуться.

Як правило, розробникові початкової програми не потрібно знати, яким чином компілятор розподіляє адреси під області пам'яті, що відводяться. Найчастіше компілятор сам вибирає оптимальний метод, і, змінюючи межі виділених областей, він завжди коректно здійснює доступ до них. Питання про це може встати, якщо з даними програми, написаної на одній мові, працюють програми, написані на іншій мові програмування (найчастіше, на мові асемблера), рідше такі проблеми виникають при використанні двох різних компіляторів з однієї і тієї ж вхідної мови. Більшість компіляторів дозволяють користувачеві в цьому випадку самому вказати, використовувати чи ні кратні адреси і яку межу кратності встановити (якщо це взагалі можливо з погляду архітектури цільової обчислювальної системи).

Якщо повернутися до розглянутого вище прикладу фрагмента програми на мові Pascal, то, якщо припустити, що кратність розміщення даних в цільовій обчислювальній системі складає 4  байти, можна розрахувати нові значення об'єму пам'яті, потрібної для розміщення описаних в цьому фрагменті змінних.

Розмір типу arr1 складатиме V1 = 10*20*4 = 800  байт. Розмір типу rec1 складе V2 = 2+800 = 802 байти, але з урахуванням кратності (4  байти) для його розміщення буде потрібно V2' = 4+800 = 804 байти. Розмір типу rec2 з урахуванням кратності складе V3' = 4+4+Max(4,4,4) = 12 байт, а розмір типу arr2 з урахуванням кратності складе V4' = 100*12 = 1200  байт. Тоді для розміщення змінної aa1 буде потрібно 800 байт пам'яті, для розміщення змінних vv1,vv2,vv3,vv4 з урахуванням кратності буде потрібно 4*4 = 16  байт пам'яті, для змінній rr1 – 804  байти, а для змінній aa2 – ще 1200 байт. Таким чином, для розміщення в пам'яті всієї описаної структури даних потрібно буде виділити V' = 2820  байт пам'яті. Видно, що об'єм необхідної пам'яті збільшився (приблизно на 12.5%), але за рахунок цього збільшується ефективність звернення до даних і, отже, швидкість виконання результуючої програми.