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/freev 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).