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?


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).


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.