CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3 - Compiler

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

main.go
package main

import (
    "fmt"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
func (p ____) Topla(q Nokta) Nokta {
    return Nokta{p.X + q.X, p.Y + q.Y}
}
Cevap
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

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