im Wesentlichen gibt es 3 Arten von Speicher, den Sie in der Programmierung verwenden: statische, dynamische/Heap und Stack.
Der statische Speicher wird vom Compiler vorab zugewiesen und besteht aus den Konstanten und Variablen, die in Ihrem Programm statisch deklariert sind.
Heap ist der Speicher, die Sie frei zuordnen können und lassen
Stapel der Speicher, die in einer Funktion deklariert für alle lokalen Variablen zugewiesen wird. Dies ist wichtig, da jedes Mal, wenn Sie die Funktion aufrufen, ein neuer Speicher für ihre Variablen zugewiesen wird. Jeder Aufruf einer Funktion stellt sicher, dass sie eine eigene Kopie der Variablen besitzt. Und jedes Mal, wenn Sie von der Funktion zurückkehren, wird der Speicher freigegeben.
Es ist absolut egal, wie der Stapel verwaltet wird, sobald er den obigen Regeln folgt. Es ist jedoch günstig, Programmspeicher im unteren Adressraum zuzuordnen und aufzuwachsen und den Stapel von einem oberen Speicherplatz zu starten und nach unten zu wachsen. Die meisten Systeme implementieren dieses Schema.
Im Allgemeinen gibt es ein Stack-Pointer-Register/Variable, die so auf die aktuelle Stack-Adresse zeigt. Wenn eine Funktion aufgerufen wird, verringert sie diese Adresse um die Anzahl der Bytes, die sie für ihre Variablen benötigt. Wenn es die nächste Funktion aufruft, wird diese neue beginnen, wobei der neue Zeiger vom Aufrufer bereits verringert wird. Wenn die Funktion zurückgibt, stellt sie den Zeiger wieder her, von dem sie gestartet wurde.
Es könnte verschiedene Schemata geben, aber soweit ich weiß, Mips und i86 folgen diesem.
Und im Wesentlichen gibt es nur einen virtuellen Speicherplatz im Programm. Dies hängt vom Betriebssystem und/oder Compiler ab.Der Compiler wird den Speicher in den logischen Bereichen für seinen eigenen Gebrauch aufteilen und hoffentlich entsprechend den in den Plattformdokumenten definierten Aufrufkonventionen behandeln.
Also, in unserem Beispiel sind v
und i
auf dem Funktionsstapel zugeordnet. cout
ist statisch. Jeder new int
Speicherplatz in Heap zuweisen. v
ist keine einfache Variable, sondern eine Struktur, die Felder enthält, die zum Verwalten der Liste benötigt werden. es braucht Platz für all diese Interna. So ändert jede push_back
diese Felder in gewisser Weise auf das zugewiesene "int". push_back() und back() sind Funktionsaufrufe und ordnen ihre eigenen Stapel für interne Variablen zu, um die obere Funktion nicht zu stören.
Dieses Programm weist Daten auf dem Heap und nicht auf dem Stack zu. – interjay
Oh, ist das wegen der Tatsache, dass ich Vektoren verwende? würde ein Zeichenarray auf dem Stapel sein? – mreff555
Sowohl die Daten des Vektors als auch die Zuordnungen von 'new int' befinden sich auf dem Heap. Nur lokale Variablen selbst (ohne eingeschlossene innere Daten wie die Vektoren) befinden sich auf dem Stapel. – interjay