Ich weiß, was "ein Stapel" ist und ich habe die FILO / FIFO-Akronyme gelernt. Aber wenn Leute sagen, Dinge wie 'ein Werttyp ist auf den Stack zugewiesen, nicht der Heap' - ich fürchte, ich weiß nicht wirklich, was das bedeutet.
Wenn ich einen logischen Fehler in eine rekursive Funktion einfüge - ich kann dem Stack keinen Speicher mehr zuweisen und meine App stürzt ab ... aber ich verstehe nicht wirklich, was es ist.
>Ich habe versucht, Google nach einer Antwort zu fragen, habe aber nur Informationen über 'einen Stapel' gefunden und wie man einen verwendet.
Wenn ich eine .Net App starte - erstellt sie eine einzelne 'Stack-Instanz', die als 'The Stack' fungiert? Ich habe Stack-Traces gesehen, die mir die Ausführungsebenen des Codes zeigen - meistens, wenn ich auf eine Ausnahme ohne Ausnahme stoße ... aber ich erinnere mich, dass ich die Methoden und die Reihenfolge, in der sie aufgerufen wurden, nicht sehen würde Der Stapel enthält außerdem alle Variablen für jeden Schritt des Stapels.
Vielleicht bin ich nur albern - aber ich denke, ich könnte mir eine Situation mit einer rekursiven Funktion vorstellen, bei der es praktisch wäre, den vorherigen Wert einer Variablen zu sehen - von "dem Stapel", aber nicht nötig in.
Weiß nicht, ob das Sinn macht - es ist schrecklich spät. Aber ich würde wirklich jede Information schätzen, die jemand hat.
Dieser Begriff bezieht sich auf den Aufruf-Stack . Sie könnten mehr über die Konzepte in einem Low-Level-Programmier- oder Computerarchitektur- / Organisationskurs erfahren, wenn Sie einen benötigen.
Immer wenn eine Funktion aufgerufen wird, werden die Rücksprungadresse (von wo aus sie aufgerufen wird) sowie Parameter für die Funktion auf "den Stack" (ein Stack im Speicher, aber keine C # Stack Datenstruktur) geschoben über die Sie auf MSDN gelesen hätten). Wenn eine Funktion beendet wird, wird die Adresse aus dem Stapel entnommen, und die Steuerung wird wieder an der ursprünglichen Position (an der Popup-Adresse) fortgesetzt. Die Informationen, die zu einem Funktionsaufruf gehören (lokale Variablen, Rücksprungadresse, Parameter usw.), werden als "Stapelrahmen" bezeichnet.
Wenn Sie also Rekursion verwenden (und in einer unendlichen rekursiven Schleife gefangen wird), füllen Sie den Stapel buchstäblich mit Rücksprungadressen (und anderen Daten), bis kein Platz mehr frei ist.
Bearbeiten - Sie haben auch den Heap erwähnt. Hier werden Datenstrukturen gespeichert (dynamische Speicherzuweisung über das Schlüsselwort new
in den meisten Sprachen dieser Tage oder malloc
in C). In C / C ++ beispielsweise sind Daten auf dem Heap vorhanden, bis sie explizit freigegeben werden. Dies steht im Gegensatz zu lokalen / automatischen Variablen, die auf dem Stack gespeichert sind (und daher zerstört werden, wenn ihr Gültigkeitsbereich endet ... sie sind aus dem Stapel herausgefallen).