Wo sind Variablen in einer Schließung gespeichert - Stack oder Heap?

8

Wie die folgenden Codes:

%Vor%

Wenn foo beendet wird (oder sagen wir zurück), wissen wir, dass die Variable a nicht zerstört wird und im Speicher bleibt (deshalb funktioniert die Schließung). Also mein Problem ist, wo die Variable ein Geschäft, Stapel oder Heap?

    
JunGor 24.03.2015, 05:48
quelle

1 Antwort

15

Eine Schließung ist nur eine Evolution des Stack-Konzepts.

Der Stapel wird zum Trennen / Isolieren des Bereichs verwendet, wenn Funktionen aufgerufen werden. Wenn eine Funktion zurückkehrt, wird der Stapelrahmen (Aktivierungsdatensatz) von dem Aufrufstapel ausgegeben, wodurch der verwendete Speicher freigegeben wird, wodurch der nächste Funktionsaufruf diesen RAM für seinen Stapelrahmen wiederverwenden kann.

Was eine Schließung bewirkt, ist, dass, anstatt dieses Stapelframe tatsächlich freizugeben, wenn es irgendein Objekt / eine Variable in diesem Stapelframe gibt, auf die durch irgend etwas anderes verwiesen wird, dieses Stapelframe für zukünftige Verwendung behält.

Die meisten Sprachen implementieren dies, indem sie den Stack als verkettete Liste oder Hash-Tabelle anstelle eines flachen Arrays implementieren. Auf diese Weise kann der Stapel zur Laufzeit neu geordnet werden und ist nicht durch das physische Speicherlayout eingeschränkt.

Also. Vor diesem Hintergrund lautet die Antwort, dass Variablen in einem Abschluss im Stack und im Heap gespeichert werden. Abhängig von Ihrem Standpunkt.

Aus der Sicht der Sprache ist es definitiv der Stapel. Da ist das, was Schließungen in der Theorie sind - ein modifizierter Stapel.

Aus der Sicht der Maschinensprache oder des zugrundeliegenden C / Assembly-Codes ist die Idee eines Linked-List-Stacks Unsinn. Daher muss die Sprache der höheren Ebene den Heap verwenden, um ihren "Stack" zu implementieren.

Die Variable befindet sich also im Stapel, aber dieser Stapel befindet sich wahrscheinlich im Heap.

Das hängt natürlich von der Implementierung Ihrer Programmiersprache ab. Aber die obige Beschreibung gilt für die meisten Javascript-Interpreter (sicherlich alle, die ich gesehen habe).

    
slebetman 24.03.2015, 06:38
quelle

Tags und Links