Junior
Aký je rozdiel medzi zásobníkom a haldou?
sobes.tech AI
Odpoveď od AI
Stack (zásobník) a Heap (hromada) sú dve oblasti pamäte používané na ukladanie údajov v programoch.
Stack:
- Používa sa na ukladanie lokálnych premenných a adries návratu funkcií.
- Funguje na princípe LIFO (Last In, First Out - posledný dovnútra, prvý von).
- Správa pamäte je automatická: pamäť sa pridelená pri vstupe do funkcie a uvoľní sa pri jej ukončení.
- Rýchlejšie ako hromada kvôli jednoduchej správe a lokálnosti dát.
- Veľkosť je pevná alebo obmedzená, môže dôjsť k pretečeniu zásobníka (stack overflow).
Heap:
- Používa sa na dynamické prideľovanie pamäte objektom, ktoré môžu zostať v pamäti po opustení aktuálnej funkcie.
- Správa pamäte je manuálna (cez
malloc/freev C/C++) alebo pomocou automatickej správy pamäte (ARC/Garbage Collection/Ownership v Swift/Rust). - Pomalejšie ako zásobník kvôli zložitejšej správe pamäte a možnej fragmentácii.
- Veľkosť je flexibilná a obmedzená iba dostupnou systémovou pamäťou.
- Môže dôjsť k úniku pamäte (memory leak), ak alokovaná pamäť nie je uvoľnená.
Porovnanie:
| Vlastnosť | Stack | Heap |
|---|---|---|
| Princíp práce | LIFO | Bez určeného poradia |
| Správa pamäte | Automatická | Manuálna alebo automatická (ARC/GC/Ownership) |
| Rýchlosť | Rýchlejšie | Pomalšie |
| Použitie | Lokálne premenné, adresy návratu | Dynamicky alokované objekty, referenčné typy |
| Veľkosť | Pevná / obmedzená | Flexibilná |
| Možné problémy | Pretečenie zásobníka | Únik pamäte, fragmentácia |
V Swifte sa Value Types (napríklad struct, enum, základné typy ako Int, Bool) zvyčajne ukladajú na zásobník, zatiaľ čo Reference Types (napríklad class, closure) na hromadu. Premenné, aj referenčné typy, môžu byť uložené na zásobníku pri určitých optimalizáciách kompilátora (escape analysis).