Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der Unterschied zwischen Heap und Stack in Golang?

Was ist der Unterschied zwischen Heap und Stack in Golang?

青灯夜游
青灯夜游Original
2023-01-10 17:27:242427Durchsuche

Der Unterschied zwischen Heap und Stack: 1. Der Heap wird zum Speichern von Speichersegmenten verwendet, die während der Prozessausführung dynamisch zugewiesen werden, während der Stack zum Speichern lokaler Variablen verwendet wird, die vorübergehend vom Programm erstellt werden. 2. Der Lebenszyklus des Heap-Speichers ist länger als der Stapelspeicher;3. Im Vergleich zum Stapelspeicher kann der Heapspeicher nicht automatisch vom Compiler freigegeben werden, sondern nur vom Garbage Collector.

Was ist der Unterschied zwischen Heap und Stack in Golang?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.

Es gibt zwei sehr wichtige Konzepte in Programmiersprachen: Heap und Stack.

Heap und Stack sind zwei sehr wichtige Datenstrukturen, die häufig beim Bearbeiten von Programmen verwendet werden, und die Go-Sprache bildet da keine Ausnahme.

Werfen wir einen Blick auf diese beiden Datenstrukturen.

Stapel

Der Stapel ermöglicht nur das Einfügen von Daten in ein Ende der linearen Liste, und dann werden die Daten an diesem Ende herausgenommen, dh die Elemente im Stapel werden in der Reihenfolge herausgenommen von First In, Last Out, Last In, First Out.

Der Vorgang, Elemente in den Stapel zu legen, wird Pushing genannt. Durch das Schieben auf den Stapel wird die Anzahl der Elemente auf dem Stapel erhöht. Das letzte in den Stapel gelegte Element befindet sich oben im Stapel und das erste in den Stapel gelegte Element befindet sich unten im Stapel.

Beim Herausnehmen von Elementen aus dem Stapel können diese nur von oben herausgenommen werden. Nach dem Herausnehmen von Elementen wird die Anzahl der Stapel kleiner. Das zuerst eingelegte Element wird immer als letztes herausgenommen Zuletzt eingelegt, wird immer zuerst herausgenommen.

Was ist der Unterschied zwischen Heap und Stack in Golang?

Heap

Bei der Speicherzuweisung ähnelt die Stapelung der Größe der Möbel in einem Raum. Bei der Speicherzuweisung müssen Sie einen ausreichend großen Platz finden Ordnen Sie die Möbel neu an.

Nach dem wiederholten Platzieren und Räumen von Möbeln wird der Raum im Raum unordentlich. Wenn Sie zu diesem Zeitpunkt Möbel in diesem Raum platzieren, werden Sie feststellen, dass zwar genügend Platz vorhanden ist, jeder Raum jedoch auf verschiedene Bereiche verteilt ist Kein durchgehender Bereich zum Aufstellen von Möbeln. Zu diesem Zeitpunkt muss der Speicherzuweiser diese Räume anpassen und optimieren.

Was ist der Unterschied zwischen Heap und Stack in Golang?

Im Vergleich zu Heap-zugewiesenem Speicher und Stapel-zugewiesenem Speicher eignet sich der Heap für die Speicherzuweisung unvorhersehbarer Größen.

Der Unterschied zwischen Stack und Heap ist:

  • Heap (Heap): Der Heap wird zum Speichern von Speichersegmenten verwendet, die während der Prozessausführung dynamisch zugewiesen werden. Seine Größe ist nicht festgelegt und kann dynamisch erweitert oder verkleinert werden. Wenn ein Prozess Funktionen wie malloc aufruft, um Speicher zuzuweisen, wird der neu zugewiesene Speicher dynamisch zum Heap hinzugefügt (der Heap wird erweitert). Wenn freie und andere Funktionen zum Freigeben von Speicher verwendet werden, wird der freigegebene Speicher aus dem Heap entfernt (der Heap wird reduziert); das Programm, das unsere Funktion ist. Lokale Variablen, die in geschweiften Klammern definiert sind

    .

    { }

  • Der Lebenszyklus des Heap-Speichers ist länger als der des Stapelspeichers. Wenn der von der Funktion zurückgegebene Wert an anderer Stelle verwendet wird, wird dieser Wert vom Compiler automatisch dem Heap zugewiesen.
  • Im Vergleich zum Stapelspeicher kann der Heap-Speicher nicht automatisch vom Compiler freigegeben werden, sondern nur vom Garbage Collector.

Heap- und Stack-ZuweisungNachdem die Variablendefinition abgeschlossen ist, hängt der vorhandene Speicherplatz im Allgemeinen davon ab, ob eine dynamische Speicherzuweisung erfolgt (neu/malloc). .

Zum Beispiel der folgende Fall

Fall 1

var p *int    //全局指针变量
func f(){
    var i int
    i = 1
    p = &i    //全局指针变量指向局部变量i
}

Fall 2

func f(){
    p := new(int) //局部指针变量,使用new申请的空间
    *p = 1
}

Im ersten Fall wird var zum Definieren lokaler Variablen verwendet, aber da i der globalen Zeigervariablen p zugewiesen wird, wenn die Funktion endet, i wird nicht freigegeben, daher wird die lokale Variable i auf dem Heap zugewiesen (manuell vom Programmierer freigegeben).

Lokale Variable: eine in einer Funktion definierte Variable, sie hat einen dynamischen Lebenszyklus: Bei jeder Ausführung wird eine neue Entität erstellt und sie bleibt bestehen, bis sie niemand mehr verwendet (z. B. wenn kein externer Zeiger darauf zeigt). Die Funktion wird beendet. Es gibt keinen Pfad für den Zugriff auf diese Variable. Zu diesem Zeitpunkt wird der von ihr belegte Speicherplatz recycelt. Im zweiten Fall wird new verwendet, um Speicherplatz zu beantragen wird nach Beenden der Funktion freigegeben, p wird auf den Stapel angewendet (Automatische Freigabe)
  • [Verwandte Empfehlungen:
  • Gehen Sie zum Video-Tutorial
]

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Heap und Stack in Golang?. 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