Heim >Backend-Entwicklung >C++ >Heap oder Stack: Wo reserviert „neu' Speicher für eine C#-Struktur?
Wenn Sie das Schlüsselwort „new“ zum Erstellen einer Struktur in C# verwenden, wird der Speicher auf dem Heap oder dem Stack zugewiesen?
Beim Erstellen einer Klasseninstanz mit dem „new“-Operator wird Speicher auf dem Heap zugewiesen. Aber wo wird der Speicher zugewiesen, wenn der Operator „new“ zum Erstellen einer Strukturinstanz verwendet wird?
Stack-Speicher und Heap-Speicher
Der Stapel ist eine Datenstruktur, die zum Speichern lokaler Variablen und Methodenaufrufe während der Programmausführung verwendet wird. Es handelt sich um eine LIFO-Struktur (Last-In-First-Out), was bedeutet, dass der zuletzt zugewiesene Speicher zuerst entfernt wird.
Der Heap ist ein dynamischer Speicherbereich, in dem Objekte nach Bedarf erstellt und zugewiesen werden. Im Gegensatz zum Stapel folgt er keiner bestimmten Reihenfolge der Speicherzuweisung.
Verwenden Sie das Schlüsselwort „new“, um eine Speicherzuweisung für die Struktur zu erstellen
Bei Strukturen müssen Sie bei Verwendung des „neuen“ Operators zwei Situationen berücksichtigen:
Parameterloser Konstruktor (new Guid();):
Konstruktor mit Parametern (new Guid(someString);):
IL-Codegenerierung
Um zu verstehen, was sich hinter den Kulissen abspielt, untersuchen wir den vom C#-Compiler generierten Intermediate Language (IL)-Code:
newobj
-Direktive weist Platz auf dem Stapel zu und ruft einen parametrisierten Konstruktor für Zwischenwerte (z. B. Methodenparameter) auf. call instance
-Direktive initialisiert einen zugewiesenen Speicherort (Stapel oder Heap) mithilfe eines parametrisierten Konstruktors. initobj
-Anweisung initialisiert einen zugewiesenen Speicherort (Stack oder Heap) und löscht seinen Inhalt auf Null (für Parameter-lose Konstruktoraufrufe). Fazit
Zusammenfassend lässt sich sagen, dass im Gegensatz zu Klasseninstanzen, die immer Speicher auf dem Heap zuweisen, die Verwendung des „new“-Operators für eine Struktur im Fall eines parameterlosen Konstruktors Speicher auf dem Heap zuweist und im Fall eines parametrisierten Konstruktors Speicher zuweist auf dem Stapel (zur Zwischenspeicherung). Dieses Verhalten spiegelt sich im generierten IL-Code wider und bietet Einblick in den zugrunde liegenden Speicherverwaltungsprozess.
Das obige ist der detaillierte Inhalt vonHeap oder Stack: Wo reserviert „neu' Speicher für eine C#-Struktur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!