У комп'ютерному програмуванні стати́чна змі́нна () — це змінна, пам'ять під яку було виділено «статично», що означає, що її (, або ) — це все виконання програми. Це відрізняється від коротковічніших автоматичних змінних, пам'ять під які й звільняється в стеку викликів, й від об'єктів, пам'ять під які динамічно виділяється та звільняється в купі.

протиставляється області видимості (де змінну можливо використовувати): «глобальна» та «локальна» стосується області, а не часу існування, але з області часто випливає час існування. У багатьох мовах глобальні змінні завжди статичні, але в деяких мовах вони динамічні, тоді як локальні змінні, як правило, автоматичні, але можуть бути статичними.

В загальному сенсі, стати́чне виділя́ння па́м'яті () — це виділяння пам'яті , до виконання пов'язаної програми, на відміну від динамічного або автоматичного виділяння пам'яті, коли пам'ять розподіляється відповідно до потреб під час виконання.

Історія

Статичні змінні сходять принаймні до (1960 р.), де вони відомі як власні змінні ():

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

Використання слова static для позначення цих змінних сходить щонайменше до BCPL (1966 р.), і було популяризоване мовою програмування C, на яку сильно вплинула BCPL. Визначення BCPL звучить так:

Зауважте, що BCPL позначала через «динамічний елемент даних» те, що зараз називають автоматичною змінною (локальною, пам'ять під яку виділяється в стеку), а не об'єкти, пам'ять під які виділяється в купі, що для них використовують термін динамічне виділяння зараз.

використовують в C та споріднених мовах як для статичних змінних, так і для інших понять.

Адресування

Режим адресування абсолютними адресами можливо використовувати лише зі статичними змінними, оскільки це єдиний тип змінних, розташування яких відоме компілятору під час компілювання. Коли програма (виконуваний файл або бібліотека) завантажується до пам'яті, статичні змінні зберігаються в сегменті даних адресного простору програми (ініціалізовані), або в сегменті BSS (не ініціалізовані), а до завантаження зберігаються у відповідних розділах об'єктних файлів.

Область видимості

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

Приклад

Приклад статичної локальної змінної в C: #include <stdio.h>

void Func() { static int x = 0; // |x| ініціалізується лише один раз за всі п'ять викликів |Func| і ця змінна // після цих викликів збільшиться п'ять разів. Кінцевим значенням |x| // буде 5. x++; printf("%d\n", x); // виводить значення |x| }

int main() { Func(); // друкує 1 Func(); // друкує 2 Func(); // друкує 3 Func(); // друкує 4 Func(); // друкує 5

return 0; }

Об'єктно-орієнтоване програмування В об'єктно-орієнтованому програмуванні також існує поняття (), яка є «» () статично визначеного класу, тобто даного класу, що є спільною для всіх примірників (об'єктів), і доступна як змінна-член цих об'єктів. Пам'ять для змінної класу динамічно визначеного класу в мовах, де класи можливо визначати під час виконання, виділяється при визначанні класу, і не є статичною.

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

Див. також Константа (програмування) Глобальна змінна Метод (програмування)#Статичний метод Локальна пам'ять ниток

Примітки

Джерела

The C++ Programming Language (special edition) by Bjarne Stroustrup (Addison Wesley, 2000; )