Junior
Stack və yığım arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Stack və Heap, proqramlarda məlumatların saxlanması üçün istifadə olunan iki yaddaş sahəsidir.
Stack:
- Yerli dəyişənlər və funksiyaların dönüş ünvanlarını saxlamaq üçün istifadə olunur.
- LIFO (Last In, First Out - son daxil olan, ilk çıxan) prinsipinə əsaslanır.
- Yaddaş idarəetməsi avtomatikdir: yaddaş funksiya daxilində ayrılır və çıxışda azad edilir.
- Sadəliyi və məlumatların lokalizasiyası səbəbindən Heap-dən daha sürətlidir.
- Həcmi sabit və ya məhdud ola bilər, stack overflow (stack daşması) baş verə bilər.
Heap:
- Ob'ektlərin dinamik yaddaş ayırması üçün istifadə olunur, bu obyektlər cari funksiyadan çıxandan sonra da yaddaşda qala bilər.
- Yaddaş idarəetməsi əl ilə (C/C++-da
malloc/free) və ya avtomatik (ARC/Garbage Collection/Ownership Swift/Rust-da) ola bilər. - Daha mürəkkəb idarə və mümkün fragmentasiya səbəbindən Stack-dən daha yavaşdır.
- Həcmi daha elastikdir və yalnız mövcud sistem yaddaşı ilə məhdudlaşır.
- Ayırılmış yaddaş azad edilməzsə, yaddaş sızması (memory leak) baş verə bilər.
Müqayisə:
| Xüsusiyyət | Stack | Heap |
|---|---|---|
| İş prinsipi | LIFO | Təyin olunmamış sıra |
| Yaddaş idarəetməsi | Avtomatik | Əl ilə və ya avtomatik (ARC/GC/Ownership) |
| Sürət | Daha sürətli | Daha yavaş |
| İstifadə | Lokal dəyişənlər, dönüş ünvanları | Dinamik ayırılan obyektlər, referans tiplər |
| Həcmi | Sabit / Məhdud | Elastik |
| Mümkün problemlər | Stack overflow | Yaddaş sızması, fragmentasiya |
Swift-də, Value Types (məsələn, struct, enum, əsas tiplər Int, Bool) adətən stack-də saxlanılır, Reference Types (məsələn, class, closure) isə heap-də. Dəyişənlər, hətta referans tiplər olsa da, bəzi optimizasiyalar (escape analysis) sayəsində stack-də saxlanıla bilər.