CATEGORII DOCUMENTE |
Clase de memorare (specificatori sau atribute)
Din punct de vedere al executiei programelor C, memoria computerului este organizata in trei zone, cunoscute in mod traditional ca segment de memorie text, segment de memorie statica (sau de date) si segment de memorie dinamica (sau stiva).
Segment de memorie text (memorie program) |
Contine instructiunile programului, deci programul executabil |
Segment de memorie statica |
Contine variabilele a caror locatie ramane fixa |
Segment de memorie dinamica (de tip stiva) |
Contine variabilele de tip automatic, parametrii functiilor si apelurile si retururile de/din functii |
In tabelul urmator se prezinta caracteristicile claselor de memorie.
Specificator de memorie |
Domeniul de vizibilitate al variabilei |
Durata de viata a variabilei |
Plasament |
Auto (automatic) |
Local fiecarei functii sau fiecarui bloc in care a fost declarata |
Temporara, numai cand se executa functia in care este declarata |
In memoria dinamica (de tip stiva) |
Register (registru) |
Local fiecarei functii |
Temporara, numai cand se executa functia in care este declarata |
In registrii microprocesorului |
Extern |
Global, de catre toate functiile dintr-un fisier sursa sau din mai multe fisiere sursa |
Permanenta, pe parcursul rularii programului executabil |
In memoria statica |
Static |
Local sau global |
Permanenta, cat timp este in memorie programul executabil |
In memoria statica |
Vizibilitatea precizeaza domeniul sau locul in care o variabila este vizibila. Domeniul de vizibilitate este in general determinant si in stabilirea duratei de viata a variabilei.
Din punctul de vedere al duratei de viata a variabilei, aceasta poate fi temporara (exista numai pe perioada in care functia care o declara este activata) sau permanenta (exista pe toata durata de executie a programului).
Daca tipul se declara explicit in declaratorul variabilei, clasa de memorie se determina prin specificatorul de clasa de memorie si prin locul unde se face declaratia (in interiorul unei functii sau inaintea oricarei functii).
Variabilele cele mai folosite sunt cele care sunt declarate in blocurile apartinand unei functii. Aceste variabile sunt de doua feluri:
auto, asa cum sunt marea majoritate a variabilelor declarate numai prin tip. Acesta este un specificator implicit, deci nu este nevoie sa il invocam la declararea variabilelor. Variabilele auto sunt plasate in memoria stiva, iar domeniul de vizibilitate este local, numai pentru functia in care variabila a fost declarata, iar din punctul de vedere al duratei de viata sunt volatile, adica dispar din memoria stiva dupa reintoarcerea din functie.
static, declarate explicit. Variabilele static sunt plasate in memoria statica, iar domeniul de vizibilitate este local, numai pentru functia in care variabila a fost declarata, iar din punctul de vedere al duratei de viata sunt permanente, adica nu dispar din memoria statica dupa reintoarcerea din functie.
register, declarate explicit. Variabilele register sunt identice cu cele auto cu exceptia faptului ca stocarea nu are loc in memoria stiva ci in registrii interni ai microprocesorului in scopul sporirii vitezei de executie a programelor.
extern, declarate explicit. Din punct de vedere al modularii unor programe, este preferabil sa divizam un program complex in mai multe module program care se leaga in faza de link-editare. O variabila declarata extern intr-un modul program semnaleaza compilatorului faptul ca aceasta variabila a fost declarata intr-un alt modul. Aceste variabile sunt globale, adica sunt vazute de orice modul de program si de orice functie componenta a unui modul program. Stocarea are loc in memoria statica iar durata de viata este permanenta, pe toata perioada executiei programului.
Initializarea unei variabile static difera de cea a unei variabile auto prin aceea ca initializarea este facuta o singura data, la incarcarea programului in memorie si lansarea sa in executie. Dupa prima initializare, o variabila static nu mai poate fi reinitializata (de exemplu, la un nou apel al functiei in care este initializata).
Iata ilustrat acest lucru prin doua exemple simple. Se tipareste, cu ajutorul functiei receip(), un numar care este mai intai initializat cu valoarea 1 si returnat incrementat cu o unitate. In cazul folosirii variabilelor implicite locale auto se ruleaza programul:
# include <stdio.h>
short receip();
void main()
short receip()
si se obtine rezultatul:
First = 1
Second = 1
Daca se modifica in functia receip() variabila number din auto in static, vom avea
# include <stdio.h>
short receip();
void main()
short receip()
si obtinem rezultatul
First = 1
Second = 2
Limbajul C suporta patru specificatori ai claselor de memorare: auto, extern, static, register. Acestia precizeaza modul de memorare al variabilelor care ii urmeaza. Specificatorii de memorare preced restul declaratiei unei variabile care capata forma generala:
specificator_de_memorare specificator_de_tip lista_de_variabile;
Specificatorul auto
Se foloseste pentru a declara varibilele locale (obiectele dintr-un bloc). Totusi, utilizarea acestuia este foarte rara, deoarece, implicit, variabilele locale au clasa de memorare automata (auto).
Specificatorul extern
Se utilizeaza pentru a face cunoscute anumite variabile globale declarare intr-un modul de program (fisier) altor module de programe (fisiere) cu care se va lega primul pentru a alcatui programul complet.
Exemplu:
Modulul 1 Modulul 2
int x, y; extern int x, y;
char ch; extern char ch;
main() func22()
}
func23()
func1() y = 10; }
Daca o variabila globala este utilizata intr-una sau mai multe functii din modulul in care acestea au fost declarate nu este necesara utilizarea optiunii extern. Daca compilatorul gaseste o variabila ce n-a fost declarata, atunci acesta o va cauta automat printre variabilele globale.
Exemplu:
int first, last; /* variabile globale */
main( ) //folosire optionala declaratie extern
Variabile statice
Obiectele statice pot fi locale unui bloc sau externe tuturor blocurilor, dar in ambele situatii ele isi pastreaza valoarea la iesirea si intrarea, din sau in functii.
Variabile locale statice
Cand cuvantul cheie static se aplica unei variabile locale, compilatorul C creaza pentru aceasta o memorie permanenta in acelasi mod ca si pentru o variabila globala. Diferenta dintre o variabila locala statica si o variabila globala este ca variabila locala statica este cunoscuta numai in interiorul blocului in care a fost declarata.
Un exemplu de functie care necesita o astfel de variabila este un generator de numere care produce un nou numar pe baza celui anterior.
serie()
Se observa ca variabila numar_serie continua sa existe intre doua apeluri ale functiei serie() fara ca aceasta sa fi fost declarata ca variabila globala. Se observa de asemenea ca functia nu atribuie nici o valoare initiala variabilei numar_serie, ceea ce inseamna ca valoarea intiala a acesteia este 0.
Variabile globale statice
O variabila globala cu atributul static este o variabila globala cunoscuta numai in modulul in care a fost declarata. Deci o variabila globala statica nu poate fi cunoscuta si nici modificata din alte module de program (alte fisiere).
Exemplu:
static int numar_serie;
//var. globala este cunoscuta numai in acest fisier
serie()
/* initializarea variabilei numar_serie */
serie_start(val_init)
int val_init;
Apelul functiei serie_start() cu o valoare intreaga initializeaza seria generatoare de numere, dupa care apelul functiei serie() va genera urmatorul numar din serie.
Specificatorul register
Acest modificator se aplica numai variabilei de tip int si char.
Acest specificator precizeaza faptul ca variabilele declarate cu acest modificator sunt des utilizate si se pastreaza de obicei in registrele CPU. Specificatorul register nu se aplica variabilelor globale.
Exemplu: Aceasta functie calculeaza me pentru intregi :
int_putere (m, e)
int m;
register int e;
In acest exemplu au fost declarate ca variabile registru atat e cat si temp. De obicei utilizarea unei variabile registru conduce la micsorarea timpului de executie al unui program.
Exemplu :
unsigned int i;
unsigned int delay;
main()
Daca se executa acest program se va gasi ca timpul de executie al buclei registru este aproximativ jumatate din timpul de executie al variabilei non-registru.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2335
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved