Sobes.tech
Junior

Čím se liší zásobník od haldy?

sobes.tech AI

Odpověď od AI

Zásobník (Stack) a halda (Heap) jsou dvě oblasti paměti používané pro ukládání dat v programech.

Zásobník:

  • Používá se pro ukládání lokálních proměnných a adres návratu funkcí.
  • Funguje podle principu LIFO (Last In, First Out - poslední dovnitř, první ven).
  • Správa paměti je automatická: paměť je přidělena při vstupu do funkce a uvolněna při výstupu.
  • Je rychlejší než halda díky jednoduchosti správy a lokalitě dat.
  • Velikost je pevná nebo omezená, může dojít k přetečení zásobníku (stack overflow).

Halda:

  • Používá se pro dynamické přidělování paměti objektů, které mohou zůstat v paměti po opuštění aktuální funkce.
  • Správa paměti může být ruční (přes malloc/free v C/C++) nebo automatická (ARC/Garbage Collection/Ownership v Swift/Rust).
  • Je pomalejší než zásobník kvůli složitější správě a možným fragmentacím.
  • Velikost je flexibilnější a omezená pouze dostupnou systémovou pamětí.
  • Může dojít k úniku paměti, pokud alokovaná paměť není uvolněna.

Porovnání:

Vlastnost Zásobník Halda
Princip fungování LIFO Bez určeného pořadí
Správa paměti Automatická Ruční nebo automatická (ARC/GC/Ownership)
Rychlost Rychlejší Pomalejší
Použití Lokální proměnné, adresy návratu Dynamicky alokované objekty, referenční typy
Velikost Pevná / Omezená Flexibilní
Možné problémy Přetečení zásobníku (stack overflow) Únik paměti, fragmentace

V Swiftu jsou Value Types (například struct, enum, základní typy jako Int, Bool) obvykle uloženy na zásobníku, zatímco Reference Types (například class, closure) na haldě. Proměnné, i když jsou referenčního typu, mohou být uloženy na zásobníku díky určitým optimalizacím kompilátoru (escape analysis).