Stack & Heap Memory

What is the difference between the stack and the heap?

This question is likely related to wanting a better understanding of how local variables are stored versus explicitly dynamically allocated variables.

Function parameters and local variables are generally allocated on a stack. A stack, in computer terms, is basically a linear structure in memory where information (values for variables, for example) are stored sequentially with the most recently added value at the “top” or the end of the memory structure from which values are also read and removed. This allows a function to call itself recursively, and have separate copies of all its parameters and local variables retained separately for each call. The variable values are all “pushed” onto the stack, and then execution begins with a new set of values in the new call. When the function returns, the variable values are restored by “popping” the values from the “top” of the stack in reverse order, thus restoring the previous values of all the variables.

A heap is generally used for larger data structures or memory that the programmer wants to explicitly manage. Whenever “new” or “malloc” is used in C++ or C respectively, the memory for that request is allocated on a heap, and then it’s up to the coder to make sure that is gets freed at the appropriate time with “delete” or “free”. Whereas stack data is usually easy to manage because the compiler allocates and frees the space, heap data is easy to mess up because it often requires manually written code to determine when it gets allocated and freed. But it’s appropriate if you want to manage large long-lived blocks of memory independently of the scope of a function. And although all memory in a computer is linear at some level, a heap is less linear in the way it’s managed because it maintains pointers to different areas of memory making it easier to allocate and free blocks of memory in an arbitrary sequence instead of strictly in reverse order.

 

Stack and heap differ in the following ways:

  1. Memory Allocation: Stack is used for static memory allocation and Heap for dynamic memory allocation, both stored in the computer’s RAM .
  2. Variables: Variables allocated on the stack are stored directly to the memory and access to this memory is very fast, and it’s allocation is dealt with when the program is compiled. When a function or a method calls another function which in turns calls another function etc., the execution of all those functions remains suspended until the very last function returns its value. Variables allocated on the heap have their memory allocated at run time and accessing this memory is a bit slower, but the heap size is only limited by the size of virtual memory.
  3. Access: The stack is always reserved in a LIFO order, the most recently reserved block is always the next block to be freed. This makes it really simple to keep track of the stack, freeing a block from the stack is nothing more than adjusting one pointer. Element of the heap have no dependencies with each other and can always be accessed randomly at any time. You can allocate a block at any time and free it at any time. This makes it much more complex to keep track of which parts of the heap are allocated or free at any given time.

When to use stack and when to use heap?

You can use the stack if you know exactly how much data you need to allocate before compile time and it is not too big. You can use heap if you don’t know exactly how much data you will need at runtime or if you need to allocate a lot of data.

In a multi-threaded situation each thread will have its own completely independent stack but they will share the heap. Stack is thread specific and Heap is application specific. The stack is important to consider in exception handling and thread executions.

 

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

Comments

comments

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

Comments

comments