Teste de informatică pentru liceu, articole C#, C/C++, PHP
Orice program este executat de un procesor şi este gestionat de sistemul de operare. Astfel un program are disponibil accesul la următoarele facilităţi în a declara operaţii din program:
- regiştrii procesorului, ce sunt variabile simple, de genul int, char, float, double
- variabile pe stivă
- variabile (de obicei blocuri mai mari) ce sunt pe heap
Deoarece numărul de regiştri este fix pe un procesor (deşi in realitate un procesor avansat are intern un număr variabil de regiştri, numiţi regiştri virtuali, sau regiştri redenumiţi), un programator va lăsa compilatorul să decidă ce variabile va pune în regiştri, şi dacă o variabilă nu poate fi definită astfel, va fi pusă pe stivă.
Stiva la rândul ei este definită de o dimensiune fixă (in vremea sistemului de operare DOS era 16 Kbytes, acum in mod implicit de 4 Mbytes), programele care vor să folosească mai multă memorie, sau vor să o folosească fără restricţii, vor folosi o zonă de memorie ce va creşte dinamic, numită memoria heap
Alocarea in C/C++
Alocarea se face folosind malloc/free (în C) şi new/delete (în C++). Orice bloc va reţine dimensiunea zonei alocate şi de obicei dacă este alocat sau nu (pe un bit). Alocarea se face prin căutarea de blocuri libere ce oferă integral toată zona cerută de malloc.
Exemplu de alocare:
Anumite variabile sunt deja alocate:
Acum se doreşte alocarea unei noi variabile:
Alocarea blocului Maro se va face în locul unde este liber.
Atenţie: operaţia de malloc poate fi foarte înceată după o utilizare mai lungă a memoriei, deoarece o mulţime de ”goluri” apar în zona alocată, iar alocatorul va trebui să caute zonele libere.
În cazul jocurilor, în timpul animaţiilor foarte rar se foloseşte alocarea, deoarece poate încetini animaţia.
Cum se poate îmbunătăţi performanţa alocării:
- a nu aloca, folosind stiva: construieşte clasele fără a folosi new. Merge pentru variabilele locale fără a avea riscuri de a uita eliberarea lor. Există funcţia alloca în C ce rezervă o zonă de stivă care nu cere free la final.
- foloseşte un "pool" de obiecte: construieşte obiectele ce programul are nevoie înainte de a executa programul. Când cineva are nevoie de un obiect, i se va da o referinţă din pool, iar când se doreşte a ”dealoca”, se va pune înapoi în lista de obiecte.
- foloseşte un alocator rapid: prealocă o zonă de memorie şi alocă în ceea ce se numeşte "buffer circular". De fiecare dată aloci după ultimul obiect declarat şi elimini de la început. Este foarte folosit în procesări de comenzi în software pentru routere, drivere video ce primesc comenzi de desenare.
- caută alte alocatoare, JEMalloc este folosit de Mozilla (Firefox) din versiunea 3.0 ce va pierde puţină memorie dar grupează blocuri de memorie similare. Ele de asemenea estimează câtă memorie ar fi nevoie, ce le fac să lucreze ca un pool de memorie şi reduc numărul de alocări.
Ciprian Khlud a fost elev al Colegiului Anghel Rugină Vaslui între anii 1997-2001. Astăzi este senior programator la Litera, o companie internaţională specializată în procesarea documentelor legale. În trecut a fost programator in domeniul CAD (NaroCAD, Di.Tech Iasi), aviaţie (Indra Sistemas), baze de date (Embarcadero Technologies) şi programare OpenGL (pentru o distribuţie de Linux specializată pentru case: PlutoHome). În timpul liber el programează un program de desenare, scris în C# cu Gtk+ la care sursa poate fi descărcată de aici.