Stack versus heap: geheugengebieden vergeleken
Een draaiend programma gebruikt voor data vooral twee geheugengebieden. De stack bevat de frames van functieaanroepen: lokale variabelen, argumenten en returnadressen. Hij wordt automatisch beheerd en is zeer snel, maar klein en gebonden aan de levensduur van de functieaanroep. De heap bevat geheugen dat het programma expliciet opvraagt, bijvoorbeeld met malloc of new, en dat blijft bestaan tot het wordt vrijgegeven. De heap is flexibel en groot, maar langzamer, en daar ontstaan geheugenlekken en fragmentatie.
| Kenmerk | Stack | Heap |
|---|---|---|
| Doel | Frames van functieaanroepen. Lokale variabelen, argumenten, returnadressen | Dynamisch toegewezen data die langer leeft dan een functie of waarvan de grootte vooraf onbekend is |
| Toewijzing | Automatisch. De stackpointer verschuift bij elke aanroep en terugkeer | Expliciet. malloc en free, new en delete, of een garbage collector |
| Snelheid | Zeer snel. Alleen een pointer verschuiven | Langzamer. De allocator zoekt een vrij blok en houdt administratie bij |
| Levensduur | Tot de functie terugkeert | Tot het geheugen wordt vrijgegeven (of door de garbage collector wordt opgeruimd) |
| Grootte | Beperkt (meestal enkele MB per thread) | Alleen beperkt door het beschikbare geheugen |
| Ligging | Groeit meestal omlaag vanaf hoge adressen | Groeit meestal omhoog vanaf lage adressen. De twee groeien naar elkaar toe |
| Fragmentatie | Geen | Mogelijk. Herhaald toewijzen en vrijgeven laat onbruikbare gaten achter |
| Threads | Elke thread heeft een eigen stack | Gedeeld door alle threads, dus de allocator moet thread-safe zijn |
| Veelvoorkomende fouten | Stack overflow door diepe recursie of grote lokale arrays | Geheugenlekken, use-after-free, double free, onvoldoende geheugen |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.