Zeiger auf lokale Struktur zurückgeben


85

Ich sehe einige Codebeispiele mit Konstrukten wie diesem:

type point struct {
  x, y int
}

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

Ich habe C ++ - Hintergrund und es scheint mir ein Fehler zu sein. Was ist die Semantik eines solchen Konstrukts? Wird auf dem Stapel oder Heap ein neuer Punkt zugewiesen?


1
Eine ähnliche Frage (die Antwort verweist
Denys Séguret

@ DenysSéguret es ist nicht ähnlich
Mangusta

Antworten:


109

Go führt eine Zeiger-Escape-Analyse durch. Wenn der Zeiger dem lokalen Stapel entgeht, was in diesem Fall der Fall ist, wird das Objekt auf dem Heap zugewiesen. Wenn es der lokalen Funktion nicht entgeht, kann der Compiler es dem Stapel zuordnen (obwohl es keine Garantien gibt; es hängt davon ab, ob die Zeiger-Escape-Analyse beweisen kann, dass der Zeiger für diese Funktion lokal bleibt).


13
Hier ist ein Blogpost (Haftungsausschluss: den ich geschrieben habe), der Go's Fluchtanalyse etwas genauer untersucht: scvalex.net/posts/29
scvalex

@ LilyBallard hat Ihre Antwort nicht vollständig erhalten. Sie meinen, dass es immer möglich ist, die Tatsache zu beweisen, dass der Zeiger entkommen ist, während dies nicht der Fall ist?
Mangusta

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.