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);
Оскільки пам'ять виділяється для певної мети і звільняється, коли її використання завершилося, то можна використати ту саму пам'ять в інший момент часу для інших цілей в іншій частині програми.