Middle+
Bir goroutine içinde vurgulandığında değişken nerede bulunur?
sobes.tech yapay zeka
AI'dan gelen yanıt
Bir değişken hem goroutine'un yığınına hem de yığına tahsis edilebilir. Bu, Go derleyicisinin escape analysis (kaçış analizi) mekanizmasıyla belirlenir.
Escape analizi temel prensipleri:
- Derleyici, değişkenin yalnızca bir fonksiyon çağrısı içinde veya sadece bir goroutine'un yığını sınırları içinde yaşadığını kanıtlayabiliyorsa, bu değişken o goroutine'un yığınına tahsis edilir. Bu daha hızlıdır, çünkü yığın otomatik olarak yönetilir ve çöp toplamaya gerek yoktur.
- Derleyici, değişkenin yığınla sınırlı olduğunu kanıtlayamazsa veya dışarıdan referanslar varsa (örneğin, göstericiyle başka bir fonksiyona geçirilmiş, küresel bir değişkene yazılmış veya göstericiyle bir fonksiyondan döndürülmüş), bu değişken yığında tahsis edilir. Yığın, çöp toplamayı gerektirir ve bu da performansı yavaşlatabilir.
Yığın üzerinde tahsis örneği:
// 'x' değişkeni, yalnızca fonksiyon içinde kullanıldığı için yığında tahsis edilir.
func exampleStack() int {
x := 10
return x
}
Yığında tahsis örneği:
// 'p' (int göstericisi) ve ona işaret eden int, yığında tahsis edilebilir.
// Bu, göstericinin fonksiyondan döndürülmesi ve dışarıda kullanılabilmesi nedeniyle olur.
func exampleHeap() *int {
x := 20 // 20 değeri yığında tahsis edilebilir
return &x // x değişkeninin adresini döndürür
}
Escape analizi derleme sırasında gerçekleşir. Bunu -gcflags "-m" bayrağı kullanarak kontrol edebilirsiniz:
go build -gcflags "-m" your_package_name
Derleyici çıktısı, hangi değişkenlerin "escape to heap" olduğunu gösterecektir.
Dolayısıyla, değişkenin konumu (yığın vs. yığın) değil, Go derleyicisinin onun yaşam döngüsü ve kapsamını nasıl analiz ettiğine bağlıdır.