Heim >Backend-Entwicklung >C++ >Heap oder Stack: Wo reserviert „neu' Speicher für eine C#-Struktur?

Heap oder Stack: Wo reserviert „neu' Speicher für eine C#-Struktur?

DDD
DDDOriginal
2025-01-13 15:16:41698Durchsuche

Heap or Stack: Where Does `new` Allocate Memory for a C# Struct?

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:

  1. Parameterloser Konstruktor (new Guid();):

    • Mit dem „new“-Operator und dem parameterlosen Konstruktor wird Speicher für die Struktur auf dem Heap reserviert.
    • Das liegt daran, dass der C#-Compiler parameterlose Konstruktoren als Sonderfall behandelt und sie als Null-Initialisierungsoperationen behandelt.
    • Daher wird ein neuer Speicherort auf dem Heap erstellt und die Struktur darin aufgebaut.
  2. Konstruktor mit Parametern (new Guid(someString);):

    • Durch die Verwendung des „new“-Operators und des parametrisierten Konstruktors wird Speicher auf dem Stapel für die temporäre Speicherung zugewiesen.
    • Nachdem der Konstruktor die Struktur initialisiert hat, wird der zugewiesene Stapelspeicher verworfen.
    • Dieser Prozess unterscheidet sich vom Zuweisen einer instanziierten Struktur zu einer lokalen Variablen, die wie ein parameterloser Konstruktor Speicher auf dem Heap zuweist.

IL-Codegenerierung

Um zu verstehen, was sich hinter den Kulissen abspielt, untersuchen wir den vom C#-Compiler generierten Intermediate Language (IL)-Code:

    Die
  • newobj-Direktive weist Platz auf dem Stapel zu und ruft einen parametrisierten Konstruktor für Zwischenwerte (z. B. Methodenparameter) auf.
  • Die
  • call instance-Direktive initialisiert einen zugewiesenen Speicherort (Stapel oder Heap) mithilfe eines parametrisierten Konstruktors.
  • Die
  • 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn