Memorija na steku i hipu (Stack & Heap Memory)

Koja je razlika između steka i hipa?

Ovo pitanje je verovatno povezano sa željom boljeg razumevanja kako se skladište lokalne promenljive, nasuprot eksplicitno dinamički alociranih promenljivih.

Parametri funkcije i lokalne promenljive su generalno alocirane na steku. Stek, kao termin u računarstvu, u osnovi je linearna struktura u memoriji gde su informacije (kao npr vrednosti za promenljive) pohranjene sekvencijalno, tako da je najskorije dodata vrednost na “vrhu” ili na kraju memorijske strukture iz koje su vrednosti takođe čitane  i uklonjene.  Ovo funkciji omogućava da poziva samu sebe rekurzivno, kao i da ima odvojene kopije svih pripadajućih parametara i lokalnih promenljivih zadržane posebno za svaki poziv. Vrednosti promenljivih su sve “gurnute” na stek, tako da izvršavanje počinje novim skupom vrednosti u novom pozivu. Kada funkcija vraća vrednost, vrednosti promenljivih su povraćene “skidanjem” vrednosti sa “vrha” steka u obrnutom redosledu, čime omogućava povratak prethodnih vrednosti svih promenljivih.

Hip se, u opštem slučaju, koristi za veće strukture podataka ili za memoriju kojom programer želi eksplicitno da upravlja. Kad god su korišćene naredbe “new” ili “malloc” u C++ ili C respektivno, memorija za taj zahtev je alocirana na hipu, a tada je na programeru odgovornost da se uveri da se ista ta hip memorija oslobađa u odgovarajućem momentu koristeći “delete” ili “free””. Dok je podacima na steku obično jednostavno upravljati zato što kompajler alocira i oslobađa prostor, podatke na hipu je lako pobrkati zato što je često potrebno ručno napisati kod radi određivanja kada se alocira i oslobađa. Ali jeste odgovarajuće, ako hoćete da upravljate dugotrajnim blokovima memorije nezavisno od dosega funkcije. Uprkos činjenici da je sva memorija u računaru linearna na nekom nivou, hip je manje linearan na način kojim se upravlja zato što rukuje pokazivačima na različite oblasti memorije, čime olakšava alociranje i oslobađanje blokova memorije u proizvoljnom rasporedu, umesto striktno u obrnutom poretku.

 

Stek i hip se razlikuju na sledeće načine:

  1. Memorijska alokacija: stek se koristi za statičku alokaciju memorije, dok se hip koristi za dinamičku memorijsku alokaciju, pri čemu su obe smeštene u RAM-u računara.
  2. Promenljive: Promenljive, koje su alocirane na steku, jesu smeštene direktno u memoriju i zato je pristup ovoj memoriji veoma brz, dok se o alokaciji razmišlja onda kada program biva kompajliran. Kada funkcija ili metod pozove drugu funkciju koja zatim poziva sledeću funkciju itd., izvršenje svih ovih funkcija ostaje suspendovano sve dok i poslednja funkcija ne vrati svoju vrednost. Promenljivama alociranim na hipu memorija je alocirana u vremenu izvršenja i pristup ovoj memoriji je malo sporiji, ali veličina hipa je jedino limitirana veličinom virtuelne memorije.
  3. Pristup: Stek je uvek rezervisan u LIFO poretku (LastInFirstOut – Poslednji Unutra Prvi Napolje), odnosno najskorije rezervisani blok je uvek sledeći blok za oslobađanje. Ovo čini jednostavnim pratiti stek, jer oslobađanje bloka iz steka nije ništa drugo nego podešavanje jednog pokazivača. Elementi na hipu nemaju međusobne zavisnosti, pa im se uvek može pristupiti metodom slučajnog izbora u bilo kom momentu. Moguće je alocirati blok u bilo kom momentu, kao i osloboditi ga u bilo kom momentu. Ovim se veoma komplikuje praćenje koji delovi hipa su alocirani ili oslobođeni u bilo kom datom momentu vremena.

Kada koristiti stek, a kad koristiti hip?

Možete koristiti stek ako tačno znate koliko podataka morate da alocirate pre kompajliranja i da to nije suviše veliko.
Možete koristiti hip ako ne znate tačno koliko podataka će vam trebati u vremenu izvršenja, ili ako vam je potrebno da alocirate mnoštvo podataka.

U situaciji sa više tredova, svaki tred će imati svoj nezavisni stek ali će zajedno deliti hip. Stek je specifičan za tred, a Hip specifičan za aplikaciju. Stek je važan za razmatranje u rukovanju izuzecima i izvršavanju tredova.

 

https://www.quora.com/What-is-the-difference-between-the-stack-and-the-heap

https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap