9412 Stimmen

Was ist der Stack und der Heap und wo befinden sie sich?

  • Was sind der Stack und der Heap?
  • Wo befinden sie sich physisch im Speicher eines Computers?
  • In welchem Maße werden sie vom Betriebssystem oder der Laufzeitumgebung der Sprache kontrolliert?
  • Was ist ihr Geltungsbereich?
  • Was bestimmt ihre Größen?
  • Was macht einen schneller?

5 Stimmen

@mattshane Die Definitionen von Stack und Heap hängen überhaupt nicht von Wert- und Referenztypen ab. Mit anderen Worten, der Stack und Heap können vollständig definiert werden, auch wenn Wert- und Referenztypen niemals existiert hätten. Darüber hinaus ist der Stack nur ein Implementierungsdetail beim Verständnis von Wert- und Referenztypen. Laut Eric Lippert: Der Stack ist ein Implementierungsdetail, Teil Eins.

248 Stimmen

Eine wirklich gute Erklärung finden Sie hier Was ist der Unterschied zwischen einem Stapel und einem Heap?

19 Stimmen

Auch (wirklich) gut: codeproject.com/Articles/76153/… (der Stack-/Heap-Teil)

2voto

nCardot Punkte 4369

Der Stack ist im Grunde ein leicht zugänglicher Speicher, der seine Elemente einfach als - na ja - Stapel verwaltet. Nur Elemente, für die die Größe im Voraus bekannt ist, können auf den Stack kommen. Dies trifft auf Zahlen, Strings, Booleans zu.

Der Heap ist ein Speicher für Elemente, deren genaue Größe und Struktur nicht im Voraus festgelegt werden können. Da Objekte und Arrays mutiert und zur Laufzeit geändert werden können, müssen sie in den Heap.

Quelle: Academind

2voto

Die CPU-Stack und der Heap sind physisch mit der Funktionsweise der CPU und der Register im Zusammenhang mit dem Speicher, mit der Funktionsweise der Maschinen-Assembler-Sprache, nicht mit den Hochsprachen selbst, auch wenn diese Sprachen kleine Dinge entscheiden können.

Alle modernen CPUs arbeiten mit der "gleichen" Mikroprozessor-Theorie: Sie basieren alle auf dem sogenannten "Registers" und einige davon sind für den "Stack" zur Leistungssteigerung. Alle CPUs haben Stack-Register seit Beginn und sie waren immer hier, sozusagen, soweit ich weiß. Die Assemblersprachen sind seit Beginn gleich, trotz Variationen... bis hin zu Microsoft und seiner Intermediate Language (IL), die das Paradigma geändert hat, um eine OO-Virtual-Maschinen-Assembler-Sprache zu haben. Also werden wir in Zukunft einige CLI/CIL CPUs haben (ein Projekt von MS).

CPUs haben Stack-Register, um den Zugriff auf den Speicher zu beschleunigen, aber sie sind im Vergleich zur Verwendung anderer Register zur vollständigen Nutzung des verfügbaren Speichers für den Prozess begrenzt. Deshalb sprechen wir über Stack- und Heap-Zuweisungen.

Zusammenfassend und im Allgemeinen ist der Heap groß und langsam und dient für "globale" Instanzen und Objektinhalte, während der Stack klein und schnell ist und für "lokale" Variablen und Verweise (versteckte Zeiger, um sie zu verwalten, zu vergessen).

Also, wenn wir das Schlüsselwort "new" in einer Methode verwenden, wird die Referenz (ein int) im Stack erstellt, aber das Objekt und all sein Inhalt (Werttypen sowie Objekte) wird im Heap erstellt, soweit ich mich erinnere. Aber lokale elementare Werttypen und Arrays werden im Stack erstellt.

Der Unterschied im Speicherzugriff liegt auf Zellebene: Der Zugriff auf den Heap, den gesamten Speicher des Prozesses, erfordert mehr Komplexität in Bezug auf die Verwaltung von CPU-Registern als der Stack, der "lokaler" hinsichtlich der Adressierung ist, da das CPU-Stack-Register als Basisadresse verwendet wird, soweit ich mich erinnere.

Deshalb bekommen wir bei sehr langen oder unendlichen rekursiven Aufrufen oder Schleifen schnell einen Stacküberlauf, ohne das System auf modernen Computern zum Stillstand zu bringen...

C# Heap(ing) Vs Stack(ing) In .NET

Stack vs Heap: Know the Difference

Statische Klassen-Speicherzuweisung, wo wird sie gespeichert C#

Was und wo sind der Stack und der Heap?

https://en.wikipedia.org/wiki/Memory_management

https://en.wikipedia.org/wiki/Stack_register

Assembler-Sprachressourcen:

Assembler-Programmier-Tutorial

Intel® 64 und IA-32-Architekturen Softwareentwickler-Handbücher

1voto

anshkun Punkte 125

Wenn ein Prozess erstellt wird, dann richtet das BS nach dem Laden von Code und Daten den Heap ein, der direkt nach dem Ende der Daten beginnt, und den Stack oben im Adressraum basierend auf der Architektur

Wenn mehr Heap benötigt wird, wird das BS dynamisch zuteilen und der Heap-Datenblock ist immer virtuell zusammenhängend

Bitte beachten Sie die Systemaufrufe brk(), sbrk() und alloca() in Linux

0voto

aquagremlin Punkte 3317

Danke für eine wirklich gute Diskussion, aber als echter Anfänger frage ich mich, wo Anweisungen aufbewahrt werden? Am ANFANG haben Wissenschaftler sich zwischen zwei Architekturen (von NEUMANN, bei der alles als DATEN betrachtet wird, und HARVARD, wo ein Bereich des Speichers für Anweisungen reserviert war und ein anderer für Daten) entschieden. Letztendlich haben wir uns für das von Neumann-Design entschieden und jetzt wird alles als 'gleich' betrachtet. Das hat es mir schwer gemacht, als ich Assembler gelernt habe https://www.cs.virginia.edu/~evans/cs216/guides/x86.html, weil sie über Register und Stackzeiger sprechen.

Alles oben handelt von DATEN. Meine Vermutung ist, dass eine Anweisung eine definierte Sache mit einem spezifischen Speicherbedarf ist, sie also auf den Stack gehen würde und daher alle 'diese' Register, über die in der Assembler diskutiert wird, auf dem Stack sind. Natürlich kam dann objektorientierte Programmierung, bei der Anweisungen und Daten in eine dynamische Struktur gemischt werden, also würden Anweisungen jetzt auch auf dem Heap aufbewahrt werden?

0 Stimmen

Nach meinem Wissensstand existieren immer noch viele CPUs mit der Harvard-Architektur (typischerweise optimierte DSPs), die getrennten Speicher (und Bus) für Anweisungen und Daten haben. (Einige von ihnen sogar mehr als 1 Datenspeicher). Dies dient dazu, die Zyklusdauer zu optimieren (Anweisungsholen, Datentransport und Ausführung der vorherigen Anweisung erfolgt alles in einem Maschinenzyklus), um so von dem zu profitieren, was sie Pipe-Lining nennen. Mir ist nicht bekannt, dass Anweisungen in irgendeiner Weise im Stack platziert werden sollten. Wie auch immer, ich habe das Gefühl, dass diese Antwort möglicherweise ein wenig über den Umfang der ursprünglichen Frage hinausgeht...

1 Stimmen

@SoldOut Dies ist überhaupt keine Antwort... sondern eine andere Frage, die den Antwortverlauf verschmutzt. Dies sollte gelöscht und bei Bedarf als separate Frage erneut veröffentlicht werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X