Zwróć wskaźnik do struktury lokalnej

85

Widzę przykłady kodu z takimi konstrukcjami:

type point struct {
  x, y int
}

func newPoint() *point {
  return &point{10, 20}
}

Mam tło C ++ i wydaje mi się, że to błąd. Jaka jest semantyka takiej konstrukcji? Czy nowy punkt jest przydzielany na stosie lub stercie?

demi
źródło
1
Podobne pytanie (w odpowiedzi linki do dokumentacji): stackoverflow.com/questions/12098435/…
Denys Séguret,
@ DenysSéguret to nie jest podobne
mangusta

Odpowiedzi:

109

Go wykonuje analizę ucieczki wskaźnika. Jeśli wskaźnik ucieka ze stosu lokalnego, co robi w tym przypadku, obiekt jest alokowany na stercie. Jeśli nie ucieknie przed funkcją lokalną, kompilator może przydzielić ją na stosie (chociaż nie daje żadnych gwarancji; zależy to od tego, czy analiza ucieczki wskaźnika może udowodnić, że wskaźnik pozostaje lokalny dla tej funkcji).

Lily Ballard
źródło
13
Oto post na blogu (zastrzeżenie: które napisałem), który trochę dokładniej przygląda się analizie ucieczki Go: scvalex.net/posts/29
scvalex
@LilyBallard nie uzyskał pełnej odpowiedzi. Masz na myśli, że udowodnienie faktu ucieczki wskaźnika jest zawsze możliwe, podczas gdy udowodnienie faktu NIE ucieczki nie jest?
mangusta