Speicherlayout von Go-Abschlüssen
Go-Abschlüsse ermöglichen, wie Abschlüsse in vielen anderen Programmiersprachen, Funktionen den Zugriff auf Variablen, die außerhalb ihres Gültigkeitsbereichs definiert sind. Während das Konzept von Abschlüssen in allen Sprachen ähnlich ist, kann die Art und Weise, wie sie im Speicher dargestellt werden, variieren. In Go sind Abschlüsse einfache Heap-Zuweisungen.
Die Funktion m := M.Adder() erstellt sowohl einen Funktionsabschluss als auch eine Zuweisung für den M-Wert. Der für diesen Abschluss zugewiesene Speicher enthält Zeiger sowohl auf die Funktion als auch auf den M-Wert. Die Funktion wird auf dem Stapel zugewiesen, während der M-Wert auf dem Heap zugewiesen wird. Der insgesamt zugewiesene Speicher beträgt 16 Byte (für den Zeiger auf die Funktion und den M-Wert) plus die Größe des M-Werts (in diesem Fall 8 Byte).
Der zurückgegebene func()-Wert aus dem Abschluss Der Aufruf reserviert keinen zusätzlichen Speicher. Es verweist lediglich auf die vorhandene Abschlusszuordnung, die Zeiger auf die Funktion und den M-Wert enthält.
Daher beträgt der gesamte zugewiesene Speicher beim Aufruf von a := m.Adder() 24 Bytes (16 Bytes für den Abschluss). und 8 Bytes für den M-Wert). Der Funktionswert selbst reserviert keinen zusätzlichen Speicher und verweist lediglich auf den Abschluss.
Das obige ist der detaillierte Inhalt vonWie implementiert Go Schließungen im Speicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!