CATEGORII DOCUMENTE |
Alocarea dinamica a memoriei
Una dintre cele mai costisitoare resurse ale unui program este este memoria utilizata. Programarea este o activitate in care, in afara corectitudinii programelor elaborate, se urmareste si eficienta acestora, masurata prin timpul de executie si memoria utilizata. In scopul economiei resurselor, limbajele de programare ofera programatorului instrumentele necesare unei bune gestionari a memoriei.
Alocarea memoriei pentru variabilele locale declarate intr-o functie se face in etapa de executie a programului, pe stiva, si nu este permanenta. La iesirea din functie, stiva se curata, fapt pentru care datele alocate sunt distruse. Acest mecanism de alocare este eficient si se denumeste alocare dinamica. In schimb, datele declarate global au un comportament diferit. Pentru variabilele globale, memoria este alocata in faza premergatoare executiei si zona de memorie respectiva ramane alocata acestora pana la terminarea programului. Spre exemplu, declararea globala a unui tablou unidimensional de lungime maxima 2000 (<TipElement> tablou[2000]; ), face ca o zona de memorie considerabila sa fie blocata pentru aceasta structura, indiferent de numarul elementelor folosite efectiv, numar care in multe cazuri poate fi cu mult mai mic decat dimensiunea maxima declarata. In astfel de situatii este preferabila o maniera de alocare dinamica in vederea unei gestionari economice a memoriei. Alocarea dinamica a memoriei poate fi simplificat definita prin totalitatea mecanismelor prin care datelor le sunt asignate zone specifice de memorie in faza de executie a programelor.
Dezavantajele alocarii dinamice a memoriei constau in:
sarcina suplimentara a programatorului de a asigura si eliberarea memoriei cand nu mai are nevoie de datele respective
efectul fragmentarii memoriei care poate produce imposibilitatea alocarii ulterioare a unei zone de memorie de dimensiune dorita.
Limbajul C/C++ ofera programatorului functii standard prin care se realizeaza alocarea, respectiv, dealocarea (eliberarea) memoriei. Functiile malloc si free au prototipurile in fisierul antet: alloc.h si gestioneaza o zona de memorie speciala, denumita memoria heap .
Functia malloc:
void *malloc(size_t dimensiune)
Argumentul functiei este dimensiunea exprimata in octeti, semnificand dimensiunea zonei alocate. Functia returneaza in caz de succes adresa de memorie a zonei alocate. Este posibil ca cererea de alocare sa nu poata fi satisfacuta daca nu mai exista suficienta memorie in zona de heap sau nu exista o zona compacta de dimensiune cel putin egala cu dimensiune. In caz de insucces, functia malloc returneaza NULL.
Functia calloc:
void *calloc(size_t nrElemente, size_t dimensiune)
Efectul functiei: se aloca un bloc de memorie de marime nrElemente * dimensiune (aceasta zona nu trebuie sa depaseasca 64 Ko octeti din heap) si continutul blocului alocat este sters. In caz de succes, functia returneaza adresa blocului de memorie alocat; returneaza 0 daca nu exista spatiu liber de marimea solicitata.
Functia realloc:
void *realloc(void* adrBloc, size_t Dimensiune)
Functia incearca sa mareasca sau sa micsoreze un bloc (alocat dinamic)
la numarul de octeti specificati de parametrul Dimensiune. Parametrul adrBloc indica un bloc de memorie obtinut prin apelarea anterioara a functiei malloc, calloc sau realloc. Daca parametrul adrBloc este 0, efectul este identic cu al functiei malloc. Daca Dimensiune este 0 efectul apelului este identic cu cel al functiei free.
Functia ajusteaza marimea blocului alocat la Dimensiune si returneaza adresa blocului realocat sau 0 - daca nu se poate face realocarea.
Functia free:
void free(void * p)
Argumentul functiei este adresa zonei ce va fi eliberata. Efectul apelului functiei free este de a elibera memoria a carei adresa este p.
Exemplu
tip *p;
p= (tip*)malloc(sizeof(tip)) ;
free(p);
Observatie: operatorul sizeof returneaza dimensiunea in octeti a expresiei: sizeof(expresie). Constructia (Tip*) realizeaza o conversie explicita de tip: din tipul pointer nedefinit (void *) spre tipul pointer la Tip.
Utilizarea celor doua functii standard malloc si free devine utila si in programe in care se vor manipula tablouri de elemente: siruri de caractere, vectori de date simple, vectori de structuri, etc.
Programele urmatoare sunt exemple simple de gestionare eficienta a memoriei prin alocarea dinamica a structurilor de date:
Program - Exemplu de alocarea dinamica a tablourilor.
#include <stdio.h>
#include <stdlib.h>
int *citire_vector(int *pDim)
for (i=0; i<*pDim; i++)
return vector; //se returneaza adresa vectorului
void afisare_vector(int *vector, int n)
void main(void)
Program 2 - operatii cu siruri de caractere. Programul ca aloca dinamic memorie pentru un sir de caractere sir2 si va efectua o copiere a sirului sir1 citit de la tastatura in zona de memorie rezervata noului sir.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void)
strcpy(sir2, sir1);
printf('Sirul sursa: %s n', sir1);
printf('Sirul destinatie: %s n', sir2);
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1834
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved