CodeBlanks Logo Icon CodeBlanks

Escape analysis

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ır

Kararları 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

main.go
package main

import (
    "fmt"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
go build -gcflags=____ ./...
Cevap
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

Uzman bölümündeki tüm dersler