Wow! So many answers and I don't think one of them got it right...
1) Wo befinden sie sich (physisch im Speicher eines echten Computers) und was sind sie?
Der Stack ist ein Speicher, der als die höchste Speicheradresse reserviert ist, die Ihrem Programm zugewiesen wird, und dann von dort aus im Wert abnimmt. Er ist für Funktionenparameter und für alle temporären Variablen reserviert, die in Funktionen verwendet werden.
Es gibt zwei Heaps: öffentlich und privat.
Der private Heap beginnt auf einer 16-Byte-Grenze (für 64-Bit-Programme) oder einer 8-Byte-Grenze (für 32-Bit-Programme) nach dem letzten Byte des Codes Ihres Programms und steigt von dort aus im Wert an. Er wird auch als Standard-Heap bezeichnet.
Wenn der private Heap zu groß wird, überschneidet er sich mit dem Stack-Bereich, genauso wie der Stack sich mit dem Heap überschneidet, wenn er zu groß wird. Da der Stack bei einer höheren Adresse beginnt und sich von dort aus zu einer niedrigeren Adresse bewegt, können Sie mit entsprechenden Hacks den Stack so groß machen, dass er den privaten Heapbereich überschreitet und den Codebereich überlappt. Der Trick besteht dann darin, genügend des Codebereichs zu überlappen, damit Sie sich in den Code einklinken können. Es ist etwas knifflig zu machen und Sie riskieren einen Programmabsturz, aber es ist einfach und sehr effektiv.
Der öffentliche Heap befindet sich in seinem eigenen Speicherbereich außerhalb des Speicherplatzes Ihres Programmimages. Es ist dieser Speicher, der auf die Festplatte abgesaugt wird, wenn der Speicher knapp wird.
2) Inwieweit werden sie durch das Betriebssystem oder die Laufzeitumgebung der Sprache kontrolliert?
Der Stack wird vom Programmierer kontrolliert, der private Heap wird vom Betriebssystem verwaltet, und der öffentliche Heap wird von niemandem kontrolliert, weil es sich um einen Betriebssystemdienst handelt - Sie stellen Anfragen und entweder werden sie genehmigt oder abgelehnt.
2b) Was ist ihr Geltungsbereich?
Sie sind alle global für das Programm, aber ihr Inhalt kann privat, öffentlich oder global sein.
2c) Was bestimmt die Größe von jedem von ihnen?
Die Größe des Stacks und des privaten Heaps wird durch die Compiler-Laufzeitoptionen bestimmt. Der öffentliche Heap wird zur Laufzeit mit einem Größenparameter initialisiert.
2d) Was macht einen schneller?
Sie sind nicht darauf ausgelegt, schnell zu sein, sondern nützlich. Wie der Programmierer sie nutzt, bestimmt, ob sie "schnell" oder "langsam" sind.
REF:
https://norasandler.com/2019/02/18/Write-a-Compiler-10.html
https://learn.microsoft.com/de-de/windows/desktop/api/heapapi/nf-heapapi-getprocessheap
https://learn.microsoft.com/de-de/windows/desktop/api/heapapi/nf-heapapi-heapcreate
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