Meydan okuma 3 - Compiler
- Go kursu
- Uzman
- Ders 33/34
- 8 dk
Escape ve inline kararlarını inceleyen bir araç yazarsın.
Meydan okuma: kaçışı önle
Bir geometri kütüphanesi her hesapta işaretçi döndürüyor:
type Nokta struct{ X, Y float64 }
func yeniNokta(x, y float64) *Nokta { return &Nokta{x, y} }
func (p *Nokta) Topla(q *Nokta) *Nokta { return &Nokta{p.X + q.X, p.Y + q.Y} }Her çağrı heap'e bir nesne kaçırır. 16 baytlık küçük bir struct için değer semantiği hem daha hızlı hem ayırmasızdır. Görevin: API'yi değerle çalışacak şekilde yeniden yazmak ve farkı ölçmek.
Ne zaman işaretçi?
İşaretçi alıcı gerekir: değer büyükse (yüzlerce bayt), nesne değiştirilecekse, kopyalanmaması gereken alanlar varsa (sync.Mutex) ya da kimlik önemliyse. Küçük, değişmez veri (nokta, renk, para tutarı, zaman) için değer semantiği tercih edilir; time.Time bunun standart kütüphanedeki örneğidir.
Uygulama Değer semantiği
Nokta'yı değerle çalışan Topla ile yeniden yaz. Bir döngüde p = p.Topla(Nokta{1, 1}) işlemini testing.AllocsPerRun içinde ölç; sonucu ve 10 adım sonraki p.X değerini yazdır.
Başlangıç kodu
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"testing"
)
type Nokta struct{ X, Y float64 }
func (p Nokta) Topla(q Nokta) Nokta { return Nokta{p.X + q.X, p.Y + q.Y} }
func main() {
var p Nokta
a := testing.AllocsPerRun(10, func() { p = p.Topla(Nokta{1, 1}) })
fmt.Println(a, p.X >= 10)
}Beklenen çıktı
0 true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Küçük struct'ı değerle döndürmek neden ayırma yapmaz?
- Değer çağıranın yığınına kopyalanır, heap'e kaçmaz Doğru cevap
- GC onu görmez
- Derleyici struct'ı siler
- İşaretçiler her zaman yavaştır
Açıklama: Kopya döndürülünce yerel değişkene fonksiyon sonrası erişim gerekmez; kaçış analizi onu yığında tutar.
2 Değer alıcı
func (p ____) Topla(q Nokta) Nokta {
return Nokta{p.X + q.X, p.Y + q.Y}
}
func (p Nokta) Topla(q Nokta) Nokta {
return Nokta{p.X + q.X, p.Y + q.Y}
}
Açıklama: Değer alıcı struct'ın kopyasıyla çalışır; küçük türlerde heap ayırmasını önler.
3 Tür ve tercih
| Kavram | Anlamı |
|---|---|
Nokta (16 B) |
Değer: ucuz kopya |
Mutex içeren tür |
İşaretçi: kopyalanmamalı |
Büyük tampon (4 KB) |
İşaretçi: kopya pahalı |
time.Time |
Değer: değişmez veri |