У комп'ютерному програмуванні стати́чна змі́нна (англ. static variable) — це змінна, пам'ять під яку було виділено «статично», що означає, що її [en] (англ. lifetime, або англ. extent) — це все виконання програми. Це відрізняється від коротковічніших [en], пам'ять під які [en] й звільняється в стеку викликів, й від об'єктів, пам'ять під які динамічно виділяється та звільняється в купі.
[en] протиставляється області видимості (де змінну можливо використовувати): «глобальна» та «локальна» стосується області, а не часу існування, але з області часто випливає час існування. У багатьох мовах глобальні змінні завжди статичні, але в деяких мовах вони динамічні, тоді як локальні змінні, як правило, автоматичні, але можуть бути статичними.
В загальному сенсі, стати́чне виділя́ння па́м'яті (англ. static memory allocation) — це виділяння пам'яті [en], до виконання пов'язаної програми, на відміну від динамічного або [en] виділяння пам'яті, коли пам'ять розподіляється відповідно до потреб [en].
Історія
Статичні змінні сходять принаймні до [en] (1960 р.), де вони відомі як власні змінні (англ. own variables):
Оголошення може бути позначено додатковим описувачем own (укр. власний). Це має наступний ефект: при повторному вході до блоку значення власних величин будуть незмінними порівняно з їхніми значеннями з попереднього виходу, тоді як значення оголошених змінних, не позначених власними, невизначені.— Revised report on ALGOL 60, section "5. Declarations", p. 14 (англ.)
Це визначення дещо відрізняється від статичної змінної: воно лише визначає поведінку, а відтак, тривалість існування, а не зберігання: пам'ять під власну змінну може бути виділено, наприклад, під час першого виклику функції, а не під час завантаження програми.
Використання слова static для позначення цих змінних сходить щонайменше до BCPL (1966 р.), і було популяризоване мовою програмування C, на яку сильно вплинула BCPL. Визначення BCPL звучить так:
(1) Статичні елементи даних:
Елементи даних, час існування яких триває стільки же, скільки й час виконання програми; такі елементи даних мають явні сталі L-значення. Кожен статичний елемент даних мусить бути оголошено у визначенні функції або підпрограми, у глобальному оголошенні, або як мітку, встановлену двокрапкою.— The BCPL Reference Manual, 7.2 Space Allocation and Extent of Data Items (англ.)
Зауважте, що BCPL позначала через «динамічний елемент даних» те, що зараз називають автоматичною змінною (локальною, пам'ять під яку виділяється в стеку), а не об'єкти, пам'ять під які виділяється в купі, що для них використовують термін динамічне виділяння зараз.
[en] використовують в C та споріднених мовах як для статичних змінних, так і для інших понять.
Адресування
Режим адресування абсолютними адресами можливо використовувати лише зі статичними змінними, оскільки це єдиний тип змінних, розташування яких відоме компілятору під час компілювання. Коли програма (виконуваний файл або бібліотека) [en] до пам'яті, статичні змінні зберігаються в [en] [en] програми (ініціалізовані), або в сегменті BSS (не ініціалізовані), а до завантаження зберігаються у відповідних розділах об'єктних файлів.
Область видимості
З точки зору [en], статичні змінні мають за час існування все виконання програми, але можуть мати обмеженішу область видимості. Основна відмінність пролягає між статичною глобальною змінною (англ. static global variable), яка має глобальну область видимості й відтак знаходиться в контексті всієї програми, та статичною локальною змінною (англ. static local variable), область видимості якої локальна. Статична локальна змінна відрізняється від локальної змінної тим, що статична локальна змінна ініціалізується лише один раз, незалежно від того, скільки разів викликають функцію, в якій вона перебуває, і її значення зберігається й доступне протягом багатьох викликів функції, в якій її оголошено, наприклад, для використання як змінної лічильника. Статична змінна також може мати область видимості модуля або якийсь інший варіант, наприклад [en] в 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; }
Об'єктно-орієнтоване програмування
В об'єктно-орієнтованому програмуванні також існує поняття [en] (англ. static member variable), яка є [en]» (англ. "class variable") статично визначеного класу, тобто [en] даного класу, що є спільною для всіх примірників (об'єктів), і доступна як змінна-член цих об'єктів. Пам'ять для змінної класу динамічно визначеного класу в мовах, де класи можливо визначати під час виконання, виділяється при визначанні класу, і не є статичною.
Пам'ять під об'єктні сталі, відомі під час компілювання, такі як [en], зазвичай виділяється статично. В об'єктно-орієнтованому програмуванні пам'ять під таблиці віртуальних методів класів зазвичай виділяється статично. Статично визначене значення також може бути глобальним у своїй області видимості, що забезпечує використання того самого незмінного значення протягом виконання для цілісності.
Див. також
Примітки
- Jack Rons. . MeritHub [An Institute of Career Development]. Архів оригіналу за 19 травня 2011. Процитовано 16 червня 2011.
Компілятор виділяє необхідне місце в пам'яті для оголошеної змінної. Зарезервована адреса отримується з допомогою оператора addressof, і її може бути записано до вказівникової змінної. Оскільки більшість оголошених змінних мають статичну пам'ять, цей спосіб записування вказівникового значення до вказівникової змінної відомий як статичне виділяння пам'яті. Пам'ять призначається під час компілювання.
(англ.)
Джерела
- Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language (вид. 2nd). Upper Saddle River, NJ: Prentice Hall PTR. ISBN . (англ.)
- (special edition) by Bjarne Stroustrup (Addison Wesley, 2000; ) (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U komp yuternomu programuvanni stati chna zmi nna angl static variable ce zminna pam yat pid yaku bulo vidileno statichno sho oznachaye sho yiyi en angl lifetime abo angl extent ce vse vikonannya programi Ce vidriznyayetsya vid korotkovichnishih en pam yat pid yaki en j zvilnyayetsya v steku viklikiv j vid ob yektiv pam yat pid yaki dinamichno vidilyayetsya ta zvilnyayetsya v kupi en protistavlyayetsya oblasti vidimosti de zminnu mozhlivo vikoristovuvati globalna ta lokalna stosuyetsya oblasti a ne chasu isnuvannya ale z oblasti chasto viplivaye chas isnuvannya U bagatoh movah globalni zminni zavzhdi statichni ale v deyakih movah voni dinamichni todi yak lokalni zminni yak pravilo avtomatichni ale mozhut buti statichnimi V zagalnomu sensi stati chne vidilya nnya pa m yati angl static memory allocation ce vidilyannya pam yati en do vikonannya pov yazanoyi programi na vidminu vid dinamichnogo abo en vidilyannya pam yati koli pam yat rozpodilyayetsya vidpovidno do potreb en IstoriyaStatichni zminni shodyat prinajmni do en 1960 r de voni vidomi yak vlasni zminni angl own variables Ogoloshennya mozhe buti poznacheno dodatkovim opisuvachem own ukr vlasnij Ce maye nastupnij efekt pri povtornomu vhodi do bloku znachennya vlasnih velichin budut nezminnimi porivnyano z yihnimi znachennyami z poperednogo vihodu todi yak znachennya ogoloshenih zminnih ne poznachenih vlasnimi neviznacheni Revised report on ALGOL 60 section 5 Declarations p 14 angl Ce viznachennya desho vidriznyayetsya vid statichnoyi zminnoyi vono lishe viznachaye povedinku a vidtak trivalist isnuvannya a ne zberigannya pam yat pid vlasnu zminnu mozhe buti vidileno napriklad pid chas pershogo vikliku funkciyi a ne pid chas zavantazhennya programi Vikoristannya slova static dlya poznachennya cih zminnih shodit shonajmenshe do BCPL 1966 r i bulo populyarizovane movoyu programuvannya C na yaku silno vplinula BCPL Viznachennya BCPL zvuchit tak 1 Statichni elementi danih Elementi danih chas isnuvannya yakih trivaye stilki zhe skilki j chas vikonannya programi taki elementi danih mayut yavni stali L znachennya Kozhen statichnij element danih musit buti ogolosheno u viznachenni funkciyi abo pidprogrami u globalnomu ogoloshenni abo yak mitku vstanovlenu dvokrapkoyu The BCPL Reference Manual 7 2 Space Allocation and Extent of Data Items angl Zauvazhte sho BCPL poznachala cherez dinamichnij element danih te sho zaraz nazivayut avtomatichnoyu zminnoyu lokalnoyu pam yat pid yaku vidilyayetsya v steku a ne ob yekti pam yat pid yaki vidilyayetsya v kupi sho dlya nih vikoristovuyut termin dinamichne vidilyannya zaraz en vikoristovuyut v C ta sporidnenih movah yak dlya statichnih zminnih tak i dlya inshih ponyat AdresuvannyaRezhim adresuvannya absolyutnimi adresami mozhlivo vikoristovuvati lishe zi statichnimi zminnimi oskilki ce yedinij tip zminnih roztashuvannya yakih vidome kompilyatoru pid chas kompilyuvannya Koli programa vikonuvanij fajl abo biblioteka en do pam yati statichni zminni zberigayutsya v en en programi inicializovani abo v segmenti BSS ne inicializovani a do zavantazhennya zberigayutsya u vidpovidnih rozdilah ob yektnih fajliv Oblast vidimostiDiv takozh en Z tochki zoru en statichni zminni mayut za chas isnuvannya vse vikonannya programi ale mozhut mati obmezhenishu oblast vidimosti Osnovna vidminnist prolyagaye mizh statichnoyu globalnoyu zminnoyu angl static global variable yaka maye globalnu oblast vidimosti j vidtak znahoditsya v konteksti vsiyeyi programi ta statichnoyu lokalnoyu zminnoyu angl static local variable oblast vidimosti yakoyi lokalna Statichna lokalna zminna vidriznyayetsya vid lokalnoyi zminnoyi tim sho statichna lokalna zminna inicializuyetsya lishe odin raz nezalezhno vid togo skilki raziv viklikayut funkciyu v yakij vona perebuvaye i yiyi znachennya zberigayetsya j dostupne protyagom bagatoh viklikiv funkciyi v yakij yiyi ogolosheno napriklad dlya vikoristannya yak zminnoyi lichilnika Statichna zminna takozh mozhe mati oblast vidimosti modulya abo yakijs inshij variant napriklad en v C sho ye riznovidom oblasti vidimosti fajlu abo oblasti vidimosti modulya Priklad Priklad statichnoyi lokalnoyi zminnoyi v C include lt stdio h gt void Func static int x 0 x inicializuyetsya lishe odin raz za vsi p yat viklikiv Func i cya zminna pislya cih viklikiv zbilshitsya p yat raziv Kincevim znachennyam x bude 5 x printf d n x vivodit znachennya x int main Func drukuye 1 Func drukuye 2 Func drukuye 3 Func drukuye 4 Func drukuye 5 return 0 Ob yektno oriyentovane programuvannyaV ob yektno oriyentovanomu programuvanni takozh isnuye ponyattya en angl static member variable yaka ye en angl class variable statichno viznachenogo klasu tobto en danogo klasu sho ye spilnoyu dlya vsih primirnikiv ob yektiv i dostupna yak zminna chlen cih ob yektiv Pam yat dlya zminnoyi klasu dinamichno viznachenogo klasu v movah de klasi mozhlivo viznachati pid chas vikonannya vidilyayetsya pri viznachanni klasu i ne ye statichnoyu Pam yat pid ob yektni stali vidomi pid chas kompilyuvannya taki yak en zazvichaj vidilyayetsya statichno V ob yektno oriyentovanomu programuvanni pam yat pid tablici virtualnih metodiv klasiv zazvichaj vidilyayetsya statichno Statichno viznachene znachennya takozh mozhe buti globalnim u svoyij oblasti vidimosti sho zabezpechuye vikoristannya togo samogo nezminnogo znachennya protyagom vikonannya dlya cilisnosti Div takozhStala programuvannya Globalna zminna Statichnij metod Lokalna pam yat potokivPrimitkiJack Rons MeritHub An Institute of Career Development Arhiv originalu za 19 travnya 2011 Procitovano 16 chervnya 2011 Kompilyator vidilyaye neobhidne misce v pam yati dlya ogoloshenoyi zminnoyi Zarezervovana adresa otrimuyetsya z dopomogoyu operatora addressof i yiyi mozhe buti zapisano do vkazivnikovoyi zminnoyi Oskilki bilshist ogoloshenih zminnih mayut statichnu pam yat cej sposib zapisuvannya vkazivnikovogo znachennya do vkazivnikovoyi zminnoyi vidomij yak statichne vidilyannya pam yati Pam yat priznachayetsya pid chas kompilyuvannya angl DzherelaKernighan Brian W Ritchie Dennis M 1988 The C Programming Language vid 2nd Upper Saddle River NJ Prentice Hall PTR ISBN 0 13 110362 8 angl The C Programming Language special edition by Bjarne Stroustrup Addison Wesley 2000 ISBN 0 201 70073 5 angl