Speicherlayout von Abschlüssen in Go
Go-Funktionen, einschließlich Abschlüsse, implementieren lexikalisches Scoping und ermöglichen es ihnen, auf Variablen zu verweisen, die in ihrem umschließenden Bereich deklariert sind . Dieses Verhalten wirft die Frage auf, wie diese Abschlüsse im Speicher dargestellt werden.
In Go sind Abschlüsse im Wesentlichen Variablen, die auf die Umgebung verweisen, in der sie erstellt wurden. Der für einen Abschluss zugewiesene Speicher besteht aus:
Die Größe des für einen Abschluss zugewiesenen Speichers hängt von der Plattform und Architektur ab, umfasst jedoch normalerweise:
Betrachten Sie beispielsweise den folgenden Abschluss:
type M int func (m *M) Adder(amount int) func() { return func() { *m = *m + amount } }
Wenn Code a := m.Adder() aufruft, werden zwei Abschlüsse erstellt :
Der Das Speicherlayout des ersten Abschlusses besteht aus:
Der insgesamt zugewiesene Speicher beträgt 16 Bytes.
Das Speicherlayout des zweiten Abschlusses besteht aus:
Der insgesamt zugewiesene Speicher beträgt 24 Bytes.
Zusammenfassend lässt sich sagen, dass Go-Verschlüsse auf dem Heap implementiert werden und einen Zeiger auf den Funktionscode sowie Verweise auf erfasste Variablen speichern. Die Größe des zugewiesenen Speichers hängt von der Anzahl der erfassten Variablen und der Plattformarchitektur ab.
Das obige ist der detaillierte Inhalt vonWie werden Go-Verschlüsse im Speicher dargestellt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!