Heim  >  Artikel  >  Backend-Entwicklung  >  Wie viel Speicher verbrauchen Go-Abschlüsse tatsächlich?

Wie viel Speicher verbrauchen Go-Abschlüsse tatsächlich?

DDD
DDDOriginal
2024-10-31 21:25:29452Durchsuche

How Much Memory Do Go Closures Actually Consume?

In-Memory-Layout von Go-Abschlüssen

Im Gegensatz zu JavaScript, das eine andere Abschlussimplementierung nutzt, werden Go-Abschlüsse fällig auf dem Heap gespeichert zu variabler Langlebigkeit.

Speicherzuweisung für Abschlüsse

Betrachten Sie die folgende Funktion, die einen Abschluss generiert:

<code class="go">type M int

func (m *M) Adder(amount int) func() {
    return func() {
        *m = *m + amount
    }
}</code>

Beim Aufruf von a := m .Adder(), zwei Heap-Zuweisungen erfolgen:

  • 16 Bytes: Speichert den Funktionszeiger und den Zeiger auf die erfasste Variable (m).
  • Variablengröße: Abhängig vom Typ und der Größe der erfassten Variablen. In diesem Fall ist es ein int, es werden also 4 Bytes benötigt.

Speicherbedarf des zurückgegebenen func()-Werts

Der zurückgegebene func()-Wert verbraucht :

  • 8 Bytes auf 32-Bit-Plattformen, 16 Bytes auf 64-Bit-Plattformen:Speichert den Funktionszeiger.

Daher die Summe Der Speicherbedarf des Abschlusses beträgt in diesem Beispiel 20 Bytes auf 32-Bit-Plattformen, 32 Bytes auf 64-Bit-Plattformen.

Beispiel:

<code class="go">func closure() func() *byte {
    var b [4 * 1024]byte
    return func() *byte {
        return &amp;b[0]
    }
}</code>

Der Aufruf von close() reserviert:

  • 16 Bytes: Abschlussmetadaten (Funktionszeiger, erfasster Variablenzeiger)
  • 4096 Bytes: Das vom Abschluss erfasste Byte-Array

Ergibt eine Gesamtspeicherzuordnung von 4112 Bytes.

Das obige ist der detaillierte Inhalt vonWie viel Speicher verbrauchen Go-Abschlüsse tatsächlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn