infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Achirei Emanuel din Februarie 03, 2011, 10:28:19



Titlul: variabila globala vs variabila locala
Scris de: Achirei Emanuel din Februarie 03, 2011, 10:28:19
Initial am declarat intr-un program vectorul v[700000] local.
La rularea programului am primit eroare cum ca am depasit limita.
Vazand ca nu ii dau de capat,am declarat vectorul global si de data aceasta a mers.
Care e diferenta?
Mentionez ca nu sunt si alte subprograme in sursa.


Titlul: Răspuns: variabila globala vs variabila locala
Scris de: Stefan-Alexandru Filip din Februarie 03, 2011, 11:36:25
Variabilele globale se declara intr-o zona program. Aceasta zona este alocata la executarea programului si ramane in aceiasi structura pe toata durata executiei. In aceasta zona poti declara cat ii este permis programului.

Variabilele locale sunt declarate pe 'stiva' programului. Aceasa zona este relativ dinamica, la intrarea intr-un bloc de executie se pun pe stiva informatiile blocului iar apoi la intalnirea intructiunilor declarative se rezerva loc in capul stivei. La iesirea din blocul de executie se scot din stiva toate datele sale. Stiva are o limita de memorie separata de multe ori, dar depinde de sistemul de operare. Pana acum cativa ani limita implicita pentru stiva in linux era de 4 MB si puteai sa o setezi cat de mare voiai. In ultimele versiune de kernel nu mai stiu care e situatia, pentru ca am impresia ca nu mai ai control asa clar asupra ei.


Titlul: Răspuns: variabila globala vs variabila locala
Scris de: Achirei Emanuel din Februarie 03, 2011, 12:52:39
Si deci ar fi mai avantajos ca la fiecare program sa declar variabilele global?


Titlul: Răspuns: variabila globala vs variabila locala
Scris de: FMI Ciprian Olariu din Februarie 03, 2011, 14:10:04
Si deci ar fi mai avantajos ca la fiecare program sa declar variabilele global?

De fapt explicatia lui Filip Stefan nu o prea inteleg asa de bine,oricum nu e cea mai potrivita ca argument.
Treaba sta in felul urmator:
1.tu la o problema la un concurs ai data o limita de memorie de tipul memorie totala/memorie stiva,de exemplu 2mb/1mb sau 16mb/1mb (ce vreau sa spun e ca in general stiva e 1mb)
2.in acea memorie de stiva intra practic ce ai declarat tu in functia main
3.deci declararea vectorilor in main are 2 dezavantaje,anume ca in primul rand depasesti acea memorie pentru stiva in majoritatea problemelor(vei primi kill by signed 11 de regula),deoarece ai nevoie de vectori mari,iar in al doilea rand daca declari vectorul local in main,atunci va trebui sa-l initializezi tu dupa cu 0 peste tot(daca era declarat global era deja initializat peste tot cu 0)  :wink:
4.totusi nu este bine sa declari orice variabila globala,adica vectorii da,dar variabilele,ar trebui declarate astfel : cele importante pe care le citesti tu din fisierul de intrare,le declari globale(pentru a le folosi eventual mai usor la subprograme),iar restul intermediare si cele pentru fisierul de iesire local ; asta deoarece tot ce este declarat local se afla pe stiva si este cu mult mai rapid decat ce este global,asa ca este foarte prost sa lucrezi cu toate variabilele globale  :wink:

Deci tine minte asa :
1. VECTORII MEREU GLOBAL (bineinteles la fel si matricele sau orice alt tablou)
2. VARIABILELE IMPORTANTE GLOBAL SI RESTUL LOCAL

Sper ca ai inteles ce vreau sa zic  :D



Titlul: Răspuns: variabila globala vs variabila locala
Scris de: Achirei Emanuel din Februarie 03, 2011, 16:20:46
Multumesc mult de explicatiile aduse aici... :D