Variabilă statică - Static variable

În programarea computerului , o variabilă statică este o variabilă care a fost alocată „static”, ceea ce înseamnă că durata sa de viață (sau „întinderea”) este întreaga durată a programului. Acest lucru este în contrast cu variabilele automate cu durată mai scurtă de timp , a căror stocare este alocată în stivă și alocată în stiva de apeluri ; și spre deosebire de obiecte , a căror stocare este alocată dinamic și repartizată în memoria heap .

Durata de viață a variabilelor este contrastată cu domeniul de aplicare (unde poate fi utilizată o variabilă): „global” și „local” se referă la domeniul de aplicare, nu la durata de viață, dar domeniul de aplicare implică adesea durata de viață. În multe limbi, variabilele globale sunt întotdeauna statice, dar în unele limbi sunt dinamice, în timp ce variabilele locale sunt în general automate, dar pot fi statice.

În general, alocarea de memorie statică este alocarea memoriei latimpul de compilare, înainte de executarea programului asociat, spre deosebire dealocarea dinamică a memorieisaualocareaautomată a memoriei,unde memoria este alocată după cum este necesar întimpul rulării.

Istorie

Variabilele statice datează cel puțin la ALGOL 60 (1960), unde sunt cunoscute ca variabile proprii :

O declarație poate fi marcată cu propriul declarant suplimentar . Acest lucru are următorul efect: la o reintrare în bloc, valorile cantităților proprii vor fi neschimbate față de valorile lor la ultima ieșire, în timp ce valorile variabilelor declarate care nu sunt marcate cu propriile sunt nedefinite.

-  Raport revizuit privind ALGOL 60, secțiunea „5. Declarații”, p. 14

Această definiție este subtil diferită de o variabilă statică: specifică doar comportamentul și, prin urmare, durata de viață, nu stocarea: o variabilă proprie poate fi alocată atunci când o funcție este apelată pentru prima dată, de exemplu, mai degrabă decât la timpul de încărcare al programului.

Utilizarea cuvântului static pentru a se referi la aceste variabile datează cel puțin de BCPL (1966) și a fost popularizată de limbajul de programare C , care a fost puternic influențat de BCPL. Definiția BCPL spune:

(1) Elemente de date statice:
acele elemente de date a căror întindere durează atât timp cât execută programul; astfel de elemente de date au valori constante constante. Fiecare element de date statice trebuie să fi fost declarat fie într-o definiție de funcție sau de rutină, într-o declarație globală sau ca o etichetă setată de două puncte.

-  Manualul de referință BCPL, 7.2 Alocarea spațiului și extinderea elementelor de date

Rețineți că BCPL a definit un „element de date dinamice” pentru ceea ce se numește acum o variabilă automată (locală, alocată în stivă), nu pentru obiectele alocate în heap, care este utilizarea curentă a termenului de alocare dinamică .

Cuvântul staticcheie este utilizat în C și în limbaje conexe atât pentru variabilele statice, cât și pentru alte concepte.

Adresare

Modul de adresare a adresei absolute poate fi utilizat numai cu variabile statice, deoarece acestea sunt singurele tipuri de variabile a căror locație este cunoscută de compilator la momentul compilării. Când programul (executabil sau bibliotecă) este încărcat în memorie, variabilele statice sunt stocate în segmentul de date al spațiului de adrese al programului (dacă este inițializat) sau în segmentul BSS (dacă nu este inițializat) și sunt stocate în secțiunile corespunzătoare ale fișierelor obiect înainte la încărcare.

Domeniul de aplicare

În ceea ce privește întinderea și întinderea , variabilele statice au extinderea pe întreaga durată a programului, dar pot avea un domeniu de aplicare mai limitat . O distincție de bază este între o variabilă globală statică , care are scop global și, prin urmare, este în context pe tot parcursul programului și o variabilă locală statică , care are un scop local. O variabilă locală statică este diferită de o variabilă locală, deoarece o variabilă locală statică este inițiată o singură dată, indiferent de câte ori este apelată funcția în care se află și valoarea acesteia este păstrată și accesibilă prin multe apeluri către funcția în care este declarată , de exemplu, pentru a fi utilizată ca variabilă de numărare. O variabilă statică poate avea, de asemenea, domeniul de aplicare al modulului sau o variantă, cum ar fi legătura internă în C , care este o formă de domeniu de fișier sau domeniul de aplicare al modulului.

Exemplu

Un exemplu de variabilă locală statică în 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;
}

Programare orientată pe obiecte

În programarea orientată pe obiecte , există, de asemenea, conceptul de variabilă statică membru , care este o „ variabilă de clasă ” a unei clase definite static, adică o variabilă membru a unei clase date care este partajată între toate instanțele (obiecte) și este accesibil ca o variabilă membru a acestor obiecte. O variabilă de clasă a unei clase definite dinamic, în limbile în care clasele pot fi definite în timpul rulării, este alocată atunci când clasa este definită și nu este statică.

Constantele de obiect cunoscute în timpul compilării, cum ar fi literele șirului , sunt de obicei alocate static. În programarea orientată pe obiecte, tabelele de metode virtuale ale claselor sunt de obicei alocate static. O valoare definită static poate fi, de asemenea, globală în domeniul său de aplicare, asigurându-se că aceeași valoare imuabilă este utilizată pe tot parcursul unei curse pentru coerență.

Vezi si

Note

Referințe