Sobes.tech
Middle+

Goroutine-də vurğulanan zaman dəyişən harada yerləşir?

sobes.tech Süni İntellekt

AI-dan cavab

Dəyişən həm gorutinin yığınına, həm də yığına ayrılə bilər. Bu, Go derleyicisinin escape analysis (qaçış analizi) mexanizmi ilə müəyyən edilir.

Escape analizin əsas prinsipləri:

  • Əgər derleyici dəyişənin yalnız bir funksiya çağırışında və ya yalnız bir gorutinin yığını daxilində yaşadığını sübut edə bilirsə (yəni, ondan kənardan istinad edilmir), o zaman bu dəyişən həmin gorutinin yığınına ayrılır. Bu daha sürətlidir, çünki yığın avtomatik idarə olunur və çöp toplanması tələb olunmur.
  • Əgər derleyici dəyişənin yığınla məhdud olduğunu sübut edə bilməzsə və ya ondan kənardan istinadlar varsa (məsələn, göstərici ilə başqa funksiyaya ötürülür, qlobal dəyişkənə yazılır və ya göstərici ilə funksiyadan geri qaytarılır), o zaman bu dəyişən yığında ayrılır. Yığın çöp toplanması tələb edir və bu, icraatı yavaşlada bilər.

Yığın üzərində ayrılma nümunəsi:

// 'x' dəyişəni, yalnız funksiyada istifadə olunduğu üçün yığında ayrılır.
func exampleStack() int {
	x := 10
	return x
}

Yığında ayrılma nümunəsi:

// 'p' (göstərici ilə int) və ona işarə edən int, yığında ayrılabilir.
// Bu, göstəricinin funksiyadan geri qaytarılması və xaricdə istifadə edilə bilməsi ilə əlaqədardır.
func exampleHeap() *int {
	x := 20 // 20 dəyəri yığında ayrılır
	return &x // x dəyişəninin ünvanını qaytarır
}

Escape analizi tərtib zamanı baş verir. Bu, -gcflags "-m" bayrağı ilə yoxlana bilər:

go build -gcflags "-m" your_package_name

Tərtibçinin çıxışı hansı dəyişənlərin "escape to heap" olduğunu göstərəcək.

Beləliklə, dəyişənin yerləşməsi (yığın vs yığın) onun gorutində ayrılıb-ayrılmamasından deyil, Go tərtibçisinin onun həyat dövrünü və sahəsini necə analiz etdiyindən asılıdır.