Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lexzii_08 / Lexs_7_klaccy_pamjt.doc
Скачиваний:
22
Добавлен:
17.05.2015
Размер:
179.2 Кб
Скачать

5. Регістрові змінні

Регістрові змінні, або ж register, запам'ятовуються не її ОЗП, як усі інші змінні, а в регістрах центрального процесора, де доступ до них і робота з ними виконуються набагато швидше, ніж у пам'яті. В іншому регістрові змінні аналогічні автоматичним змінним.

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

Змінні регістрового класу пам'яті мають такі самі область видимості та час життя, як і автоматичні змінні. Не можна застосовувати register до глобальних змінних.

У процесі написання програмних комплексів необхідно cполучати різні види змінних за використанням пам'яті. Найекономніше витрачається пам'ять при роботі з автоматичними змінними. Тому треба прагнути там, де можна, використовувати цей клас пам'яті, а інші застосовувати в тих випадках, коли це необхідно, а саме:

  • зовнішні змінні слід використовувати, коли потрібно організувати передачу великих обсягів даних між кількома функціями;

  • статичні змінні в тому разі, коли необхідно неодноразово звертатися до функції і в процесі кожного звертання використовувати результати попереднього звертання;

  • регістрові змінні використовувати з метою прискорення розрахунків.

У табл. 1 наведені область видимості та час життя для змінних різних класів пам'яті.

Таблиця 1. ОБЛАСТЬ ВИДИМОСТІ ТА ЧАС ЖИТТЯ ЗМІННИХ

6. Динамічний розподіл пам'яті

У мові C++ програміст має можливість проводити розподіл пам'яті не лише на початку програми, а й у процесі її виконання в необхідному місці. Для цього слід указати розмір блоку пам'яті, що виділяється як аргумент бібліотечної функції malloc (). Прототип функції такий:

void *malloc(size_t size);

де size — необхідний розмір у байтах пам'яті, що виділяється, тип size_t визначений як беззнакове ціле.

Дана функція виділяє пам'ять і повергає вказівник типу void* на початок виділеної пам'яті, а якщо виділити пам'ять не вдається, то повертає NULL. Прототип функції знаходиться в заголовних файлах <stdlib.h> і <alloc.h>. Наприклад,

char *p;

р = (char*) malloc (100);

Виділяється область пам'яті в 100 байтів, адреса якої присвоюється змінній р. Оскільки malloc() повертає вказівник типу void*, то необхідно використати при присвоєнні перетворення одного типу вказівника на інший.

Якщо необхідно виділити пам'ять для масиву, то це можна зробити за допомогою функції calloc (), прототип якої є таким:

void *calloc (size_t n, size_t size);

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

float *p;

р = (float*) calloc (100, sizeof (float));

Виділяється пам'ять для 100 елементів, кожний розміром у 6 байтів.

Аргументи функцій malloc() і calloc() повинні бути цілого типу. Функція calloc () додатково до виділення пам'яті здійснює обнулення всього виділеного блоку.

Для звільнення виділеного функціями malloc() і calloc() об'єму пам'яті використовується функція free (). Прототип функції є таким:

void free (void *ptr);

де ptr – вказівник на блок пам'яті, що звільняється.

Функція повертає пам'ять, на яку вказує параметр ptr, в купу. Для звільнення пам'яті з попереднього прикладу необхідно записати такий вираз:

free(p);

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

Соседние файлы в папке lexzii_08