Statická proměnná - Static variable

V programování počítače , je statická proměnná je proměnná , která byla přidělena „staticky“, což znamená, že jeho životnost (nebo „míra“), je celý běh programu. To je na rozdíl od automatických proměnných s kratší dobou trvání , jejichž úložiště je přiděleno a uvolněno v zásobníku volání ; a na rozdíl od objektů , jejichž úložiště je dynamicky přidělováno a uvolňováno z paměti haldy .

Proměnná životnost je v kontrastu s rozsahem (kde lze proměnnou použít): „globální“ a „místní“ se týkají rozsahu, nikoli životnosti, ale rozsah často znamená životnost. V mnoha jazycích jsou globální proměnné vždy statické, ale v některých jazycích jsou dynamické, zatímco místní proměnné jsou obecně automatické, ale mohou být statické.

Obecně, statická alokace paměti je alokace paměti vdobě kompilace, před spuštěním přidruženého programu, na rozdíl oddynamické alokace pamětineboautomatické alokacepaměti, kde je paměť přidělována podle potřeby zaběhu.

Dějiny

Statické proměnné pocházejí minimálně z ALGOL 60 (1960), kde jsou známy jako vlastní proměnné :

Prohlášení může být označeno dodatečným vlastním deklarátorem. To má následující účinek: při opětovném vstupu do bloku se hodnoty vlastních veličin nezmění od jejich hodnot při posledním opuštění, zatímco hodnoty deklarovaných proměnných, které nejsou označeny vlastní, nejsou definovány.

-  Revidovaná zpráva o ALGOL 60, oddíl „5. Deklarace“, s. 14

Tato definice se nepatrně liší od statické proměnné: pouze určuje chování, a tedy životnost, nikoli úložiště: vlastní proměnnou lze přidělit například při prvním volání funkce, nikoli při načítání programu.

Použití slova static k označení těchto proměnných se datuje přinejmenším do BCPL (1966) a bylo propagováno programovacím jazykem C , který byl BCPL silně ovlivněn. Definice BCPL zní:

(1) Statické datové položky:
Ty datové položky, jejichž rozsah trvá tak dlouho, jak dlouho trvá provádění programu; tyto datové položky mají zjevné konstantní hodnoty L. Každá položka statických dat musí být deklarována buď v definici funkce nebo rutiny, v globální deklaraci nebo jako popisek nastavený dvojtečkou.

-  Referenční příručka BCPL, 7.2 Přidělení prostoru a rozsah datových položek

Všimněte si toho, že BCPL definoval „dynamickou datovou položku“ pro to, co se nyní nazývá automatická proměnná (místní, přidělená zásobníku), nikoli pro objekty přidělené haldě, což je současné použití termínu dynamická alokace .

staticKlíčové slovo se používá v C a příbuzné jazyky jak pro statické proměnné a dalších pojmech.

Adresování

Režim adresování absolutních adres lze použít pouze u statických proměnných, protože to jsou jediné druhy proměnných, jejichž umístění kompilátor v době kompilace zná. Když je program (spustitelný soubor nebo knihovna) načten do paměti, statické proměnné jsou uloženy v datovém segmentu adresního prostoru programu (je -li inicializován) nebo segmentu BSS (je -li neinicializován) a jsou uloženy v odpovídajících sekcích souborů objektů před k načítání.

Rozsah

Pokud jde o rozsah a rozsah , statické proměnné mají rozsah celého běhu programu, ale mohou mít omezenější rozsah . Základní rozdíl je mezi statickou globální proměnnou , která má globální rozsah a je tedy v kontextu celého programu, a statickou lokální proměnnou , která má lokální rozsah. Statická lokální proměnná se liší od lokální proměnné, protože statická lokální proměnná je inicializována pouze jednou bez ohledu na to, kolikrát je volána funkce, ve které se nachází, a její hodnota je zachována a přístupná prostřednictvím mnoha volání funkce, ve které je deklarována , např. pro použití jako proměnná počtu. Statická proměnná může mít také rozsah modulu nebo nějakou variantu, například interní propojení v C , což je forma rozsahu souboru nebo oboru modulu.

Příklad

Příklad statické lokální proměnné v C:

#include <stdio.h>

void Func() {
  static int x = 0;
  // |x| is initialized only once across five calls of |Func| and the variable
  // will get incremented five times after these calls. The final value of |x|
  // will be 5.
  x++;
  printf("%d\n", x);  // outputs the value of |x|
}

int main() {
  Func();  // prints 1
  Func();  // prints 2
  Func();  // prints 3
  Func();  // prints 4
  Func();  // prints 5

  return 0;
}

Objektově orientované programování

V objektově orientovaném programování existuje také koncept statické členské proměnné , což je „ proměnná třídy “ staticky definované třídy, tj. Členská proměnná dané třídy, která je sdílena napříč všemi instancemi (objekty), a je přístupná jako členská proměnná těchto objektů. Proměnná třídy dynamicky definované třídy v jazycích, kde lze třídy definovat za běhu, je přidělena, když je třída definována a není statická.

Objektové konstanty známé v době kompilace, například řetězcové literály , jsou obvykle přidělovány staticky. V objektově orientovaném programování jsou tabulky virtuálních metod tříd obvykle přidělovány staticky. Staticky definovaná hodnota může být ve svém rozsahu také globální, což zajišťuje konzistenci stejné neměnné hodnoty v celém běhu.

Viz také

Poznámky

Reference