Middle+
Go dilində yığın necə qurulub?
sobes.tech Süni İntellekt
AI-dan cavab
Golang-da, yığın (heap) — bu dinamik olaraq ayrılmış obyektlərin yerləşdirildiyi yaddaş sahəsidir. Bu yaddaşın idarə olunması avtomatik olaraq çöp toplayıcı (garbage collector) tərəfindən həyata keçirilir.
Əsas aspektlər:
- Dinamik ayırma: Kiçik və qısa ömürlü obyektlər, kompilyatorun onların ömür müddətinin funksiya və ya yığın sərhədləri ilə məhdudlaşdırıldığını sübut edə bilmədiyi və ya
newvə ya ünvan alma (&) ilə ayrılan obyektlər adətən yığında yerləşir. - Çöp toplayıcı (GC): Go, eyni vaxtda işləyən, üç rəngli, Mark-and-Sweep çöp toplayıcı istifadə edir. Bu, proqramın icrası ilə paralel işləyir və fasilələri minimuma endirir.
- İşarələmə (Mark): GC, kök göstəricilərdən (stackdə yerli dəyişənlər, qlobal dəyişənlər) əldə edilə bilən obyektləri keçir və onları "canlı" kimi işarələyir.
- Təmizləmə (Sweep): GC, əlçatan olan bütün yığını keçir və "canlı" olmayan obyektlərin tutduğu yaddaşı azad edir.
- Eyni vaxtda: GC, ayrı gorutinalarda işləyir və əsas proqramdakı gecikmələri azaldır.
- Qaçış analizi: Golang kompilyatoru, dəyişənin və ya dəyərin yığını və ya yığını göstərdiyini müəyyən etmək üçün qaçış analizini həyata keçirir. Əgər dəyişən və ya struktur sahəsi, cari gorutindən geri dönüşdən sonra əlçatan ola bilirsə, ehtimal ki, yığında ayrılır. Əks halda, yığında ayrılır.
// Qaçış analiz nümunəsi. // Bu obyekt ehtimal ki, yığında ayrılır, // çünki göstərici geri qaytarılır. func createPoint() *Point { p := Point{X: 1, Y: 2} return &p // Göstərici "qaçır" funksiyadan } // Bu obyekt ehtimal ki, yığında ayrılır, // çünki funksiyanın sonunda əlçatan deyil. func processValue() { val := 10 println(val) } type Point struct { X, Y int } - Arena bölünməsi: Go-da yığın, çox prosessorlu sistemlərdə daha səmərəli işləməsinə kömək edən bir neçə arenaya bölünə bilər.
- mmap istifadə: Golang,
mmap(Memory Map) sistem çağırışını istifadə edərək, yığın üçün böyük virtual yaddaş blokları ayırır. - Davamiyyət: Bəzi dillərə nisbətən, Go obyektlərin fiziki davamiyyətini təmin etmir. Yaddaş parçalanmış ola bilər.
- Əl ilə yaddaş idarəsi olmadan: İnkişaf etdirici, yaddaşı açıq şəkildə ayırmağa və ya sərbəst buraxmağa ehtiyac duymur. GC bunu avtomatik edir.
Golang-da yığın və yığın müxtəlif rolları yerinə yetirir:
| Yaddaş sahəsi | Məqsəd | İdarəetmə | Ömür müddəti |
|---|---|---|---|
| Yığın | Lokal dəyişənlər, funksiyaların parametrləri, dönüş ünvanları | Avtomatik (funksiya daxilində/xaricində) | Funksiya icra müddəti ilə məhdudlaşır |
| Yığın | Dinamik olaraq ayrılmış obyektlər, "qaçan" obyektlər, böyük strukturlar | Çöp toplayıcı (GC) | Ob'ektin əlçatanlığından asılı olaraq müəyyən edilir |