Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 1.16.7 Класи пам’яті - Програмування С, С++теорія та практика (частина 1) - Studbook

Програмування С, С++теорія та практика (частина 1)

1.16.7 Класи пам’яті

Будь-яка змінна та функція, описана у програмі на Сі, належить до конкретного класу пам’яті, що визначає час її існування та область видимості. Час існування змінної - це період, протягом якого змінна існує в пам’яті, а область видимості (область дії) - це частина програми, в якій змінна може використовуватися.

В мові Сі існує чотири специфікатори класу пам’яті: аиґо, гедіііег, ехґегп і А'Шіс.

Таблиця 1.17. Область дії та час існування змінних різних класів пам'яті

Клас пам’яті

Ключове

слово

Час існування

Область дії

Автоматичний

аиіо

тимчасово

блок

Регістровий

гедІ5Іег

тимчасово

блок

Статичний локальний

5іаііс

постійно

блок

Статичний глобальний

5іаііс

постійно

файл

Зовнішній

ехіегп

постійно

програма

 

Клас пам’яті для функції завжди ехґегпаї, якщо перед її описом не стоїть специфікатор аґаґіс. Клас пам’яті конкретної змінної залежить або від місця розташування її опису, або задається явно за допомогою спеціального специфікатору класу пам’яті, що розташовується перед описом функції. Усі змінні Сі можна віднести до одного з наступних класів пам’яті:

1)  аиіо (автоматична, локальна)

Ключове слово аиґо використовується рідко. Кожна змінна, описана в тілі функції (в середині блоку), обмеженого фігурними дужками, відноситься до класу пам’яті автоматичних (локальних) змінних:

іп£ апу£ипс ^оігі.)

{

сЬаг і'Ьет;

}

Область дії локальної змінної Неш поширюється лише на блок, в якому вона оголошена. Пам’ять відводиться під змінну динамічно, під час виконання програми при вході у блок, в якому описана відповідна змінна. Локальна змінна тимчасово зберігається в стеку, коли функція починає свою роботу. Після закінчення роботи функції, або при виході з блоку знищує виділену стекову пам’ять, відкидаючи за необхідністю всі збережені змінні, тобто при виході з блоку пам’ять, відведена під усі його автоматичні змінні, автоматично звільняється (звідси й термін - аиґошаґіс). З цієї причини декілька функцій безконфліктно можуть оголошувати локальні змінні з ідентичними іменами (це найчастіше буває з іменами лічильників циклів, індексів масивів тощо).

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

Застосування автоматичних змінних в локальних блоках дозволяє наближати опис таких змінних до місця їх розташування. Наступний приклад демонструє опис автоматичних змінних в середині блоку:

#іпс1ийе <з,Ьгііо.Ь>

VОій. таіп ()

{

ргіп^£("\п Знаходимося в таіп().");

{

іп£ і;

£ог(і=10;і>0;і--)

ргіп££("\п%гі",і);

ргіп££("\п") ;

}

}

2)  гедіоіег (регістрова)

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

Звісно, це стосується перш за все саме тих змінних, звертання до яких у функції виконуватиметься найчастіше. На практиці на цей тип змінних накладаються деякі обмеження, що відображають реальні можливості конкретної машини.       У випадку надлишкових та

недопустимих описів подібний специфікатор просто ігнорується.

3)  ехіегп (зовнішня, глобальна)

Будь-яка змінна, описана не в тілі функції (без специфікатору класу пам’яті), по замовчуванню відноситься до ехіегп - змінних (або глобальних змінних). Глобальні          змінні продовжують існувати

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

розташовується безпосередньо перед таіп():

/*£і1е1.с*/

#іпс1ийе <з-йіо.Ь> іп- д1оЬа^аг ; таіп()

{

/* орега-огз */

}

Будь-які оператори у будь-якій функції файлу Шеі.с можуть виконувати читання та запис змінної дІоЬаІуаг. Але це ще не все! Виявляється, що глобальні змінні завжди залишаються під контролем завантажувача програми, що здійснює збірку програми із множини оЬ_)-файлів. Саме завдяки цьому до зовнішніх змінних можливий доступ з інших файлів. Для того, аби таку змінну можна було б використовувати в іншому файлі, слід задати специфікатор ехіегп:

/*£і1е2.с*/

#іпс1ийе<з-йіо.Ь>

VОій. таіп ()

{

ех-егп д1оЬа^аг;

ргіп-£("д1оЬа^аг : %й", д1оЬа^аг);

)

Опис ехіегп дІоЬаІуаг; вказує компілятору на те, що ця змінна визначена як зовнішня та її опис знаходиться за межами даного файлу. У даному випадку опис ехіегп розташований в середині функції, тому його дія впливає тільки на дану функцію. Якщо розмістити його ззовні будь-якої функції, то його дія пошириться на весь файл від точки опису.

Цікаво, якщо в середині блоку описана автоматична змінна, ім’я якої співпадає з іменем глобальної змінної, то в середині блоку глобальна змінна маскується локальною. Це означає, що в такому блоці видною буде саме автоматична, тобто локальна змінна.

4)  єіаііс (статична)

Щоб обмежити доступ до змінних, дозволяючи зберегти їх значення між викриками функцій, слід оголошувати їх статичними. Статична змінна може бути внутрішньою або зовнішньою. Внутрішні статичні змінні локальні по відношенню до окремої функції, подібно автоматичним, проте на відміну від останніх продовжують існувати, а не виникають та знищуються при кожній активації функції. Це означає, що внутрішні статичні змінні є власною, постійною пам’яттю для функції: іп£ £ипс£ ^оій.)

{

з'Ьа'Ьіс іп£ Vа1ие=20;

}

Компілятор відведе постійну область пам’яті для змінної уаїие та проініціалізує її значення. Ця ініціалізація не повторюватиметься щоразу при активації функції. В подальшому змінна матиме те значення, яке вона отримала по завершенні її останньої роботи. Слід відзначити, що така змінна буде назавжди прихованою для завантажувача даної програми. Тому область дії статичних змінних обмежена функцією, в якій вона була оголошена, а функції не мають доступу до статичних змінних, оголошених в інших функціях.

Зовнішні статичні об’єкти відомі в тому файлі, в якому описані, проте в інших файлах вони невідомі. Таким чином, забезпечується спосіб об’єднання даних та маніпулюючи ними підпрограм таким чином, що інші підпрограми та дані у будь-якому випадку не зможуть конфліктувати з ними.

 

80