Escape analysis
- Go kursu
- Uzman
- Ders 15/34
- 4 dk
Derleyicinin stack/heap kararını nasıl verdiğini öğrenirsin.
Kaçış analizi
Derleyici her değişken için şunu sorar: fonksiyon bittikten sonra bu değere hâlâ erişilebilir mi? Evetse değer heap'e kaçar; hayırsa yığında kalır.
func a() *int { x := 1; return &x } // x heap'e kaçar
func b() int { x := 1; return x } // x yığında kalırKararları görmek için: go build -gcflags=-m → moved to heap: x.
Sık kaçış nedenleri
Beklenmedik kaçışlar: fmt.Println(x) gibi any parametreli fonksiyonlara geçirmek (değer arayüze kutulanır), derleme anında boyutu bilinmeyen dilimler (make([]int, n)), kapanışların yakaladığı ve fonksiyondan uzun yaşayan değişkenler, arayüz yöntem çağrıları. Sıcak kod yollarında -gcflags=-m çıktısını incelemek gereksiz heap ayırmalarını ortaya çıkarır.
Uygulama Ayırmayı ölç
İki fonksiyon yaz: isaret() *int yerel değişkenin adresini döndürsün, deger() int değerini döndürsün. Sonuçları paket düzeyi değişkenlere ata ve testing.AllocsPerRun ile ölçüp iki sayıyı yazdır.
Başlangıç kodu
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"testing"
)
var (
p *int
v int
)
//go:noinline
func isaret() *int {
x := 1
return &x
}
//go:noinline
func deger() int {
x := 1
return x
}
func main() {
a := testing.AllocsPerRun(10, func() { p = isaret() })
b := testing.AllocsPerRun(10, func() { v = deger() })
fmt.Println(a, b)
}Beklenen çıktı
1 0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangisi değerin heap'e kaçmasına <strong>yol açmaz</strong>?
- Goroutine'e işaretçisini vermek
- Değeri kopyalayarak döndürmek Doğru cevap
- Adresini döndürmek
- Global bir değişkene atamak
Açıklama: Kopya döndürmek çağırana yeni bir değer verir; yerel değişken fonksiyonla birlikte yok olabilir.
2 Kaçış raporu
go build -gcflags=____ ./...
go build -gcflags=-m ./...
Açıklama: -gcflags=-m derleyicinin kaçış ve inlining kararlarını yazdırır.
3 Kod ve sonuç
| Kavram | Anlamı |
|---|---|
return &x |
Heap'e kaçar |
return x |
Yığında kalır |
make([]int, 8) |
Yığında olabilir |
make([]int, n) |
Genellikle heap |