Stack vs. Heap: Unterschiede im Speicher erklärt

Ein laufendes Programm nutzt zwei Hauptbereiche des Speichers für seine Daten. Der Stack enthält die Aufruf-Frames von Funktionen: lokale Variablen, Argumente und Rücksprungadressen. Er wird automatisch verwaltet und ist sehr schnell, aber klein und an die Lebensdauer des jeweiligen Funktionsaufrufs gebunden. Der Heap enthält Speicher, den das Programm explizit anfordert, etwa mit malloc oder new, und der bis zur Freigabe bestehen bleibt. Der Heap ist flexibel und groß, aber langsamer, und hier entstehen Speicherlecks und Fragmentierung.

AspektStackHeap
Verwendet fürFunktionsaufruf-Frames: lokale Variablen, Argumente, RücksprungadressenDynamisch allokierte Daten, die eine Funktion überdauern müssen oder deren Größe vorab nicht bekannt ist
AllokationAutomatisch: Der Stackpointer bewegt sich bei jedem Aufruf und RücksprungExplizit: malloc und free, new und delete, oder ein Garbage Collector
GeschwindigkeitSehr schnell: nur ein Zeiger wird angepasstLangsamer: Der Allokator muss einen freien Block finden und Buch führen
LebensdauerBis die Funktion zurückkehrtBis der Speicher freigegeben wird (oder der Garbage Collector ihn einsammelt)
GrößeBegrenzt (typischerweise einige Megabyte pro Thread)Nur durch den verfügbaren Speicher begrenzt
AufbauWächst meist von hohen Adressen nach untenWächst meist von niedrigeren Adressen nach oben, sodass beide aufeinander zuwachsen
FragmentierungKeineMöglich: Wiederholtes Allokieren und Freigeben kann unbrauchbare Lücken hinterlassen
ThreadsJeder Thread hat seinen eigenen, privaten StackVon allen Threads geteilt, daher muss der Allokator threadsicher sein
Typische FehlerStack Overflow durch tiefe Rekursion oder große lokale ArraysSpeicherlecks, Use-after-free, Double-free und Speichermangel

Die Zahlenangaben sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.

Wann welches einsetzen

Stack
Für kleine, kurzlebige Daten, deren Größe zur Kompilierzeit bekannt ist: gewöhnliche lokale Variablen.
Heap
Für große Daten, Daten, deren Größe sich zur Laufzeit ändert, und Daten, die die erzeugende Funktion überdauern müssen.

FAQ

Warum ist die Stack-Allokation schneller als die Heap-Allokation?

Die Stack-Allokation bewegt nur den Stackpointer, während die Heap-Allokation einen freien Block finden und die Verwaltungsdaten des Allokators aktualisieren muss.

Was verursacht einen Stack Overflow?

Zu hoher Stack-Verbrauch, typischerweise durch tiefe oder endlose Rekursion oder sehr große lokale Arrays. Dadurch wird die Stack-Größenbeschränkung überschritten und das Programm stürzt ab.

Was ist ein Speicherleck?

Heap-Speicher, der allokiert, aber nie freigegeben wurde und daher nicht wiederverwendet werden kann. Wiederholte Lecks lassen ein Programm immer mehr Speicher belegen.

Teilen sich Threads den Stack?

Nein. Jeder Thread hat seinen eigenen Stack, während alle Threads den Heap teilen.

Wichtige Begriffe erklärt

Stack-Frame
Der Bereich, der bei jedem Funktionsaufruf auf dem Stack reserviert wird. Er enthält die Rücksprungadresse, gesicherte Register und lokale Variablen und wird beim Rücksprung der Funktion freigegeben.
Stapelzeiger (Stack Pointer)
Das Register, das auf die aktuelle Spitze des Stacks zeigt; bei RISC-V sp (x2). In vielen ISAs wächst der Stack zu niedrigeren Adressen hin.
Heap-Speicher
Der Bereich, aus dem ein laufendes Programm mit malloc und Ähnlichem Speicher beliebiger Größe bezieht und ihn mit free zurückgibt. Wiederholtes Anfordern und Freigeben kann zu Fragmentierung führen.

Weitere Vergleiche