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
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)
21 Stimmen
youtube.com/watch?v=clOUdVDDzIM&spfreload=5
5 Stimmen
Verwandte, siehe Stack Clash. Die Stack Clash-Beseitigungen betrafen einige Aspekte von Systemvariablen und Verhaltensweisen wie
rlimit_stack
. Siehe auch Red Hat Problem 14632411 Stimmen
Nicht klar in den Antworten: Für eine Laufzeitumgebung für eine Programmiersprache (z.B. .NET) gibt es pro Thread einen Stack, um Methodenaufrufe/lokale Variablen zu verwalten, und nur einen gemeinsamen Heap für alle Prozesse der Laufzeitumgebung. Der Heap wird vom Garbage Collector überwacht. Die Speicherbereiche der Laufzeitumgebung (Stacks/Heap) sind Teil des zusammenhängenden virtuellen Speichers, der vom Betriebssystem den Prozessen zugewiesen wird (der selbst von physischen RAM-Blöcken in keiner bestimmten Reihenfolge versorgt wird), auf Anforderung der Prozesse. Die Verwirrung um "Stacks" liegt an der Existenz vieler "Stack"-Arten in einem Computer, die nicht mit den Laufzeitumgebungs-Stacks zusammenhängen. Ein "Stack" ist einfach eine LIFO-Speicherstruktur.
0 Stimmen
Wenn Sie eine Simulation sehen möchten, wie der Stapel und der Heap während der Ausführung eines C-Programms aussehen, versuchen Sie C Tutor.
0 Stimmen
Du solltest definitiv dieses Video sehen, das alle oben genannten Antworten klärt youtube.com/watch?v=7O4JPdKjc30