Heap- und Stack-Zuordnung: Arrays und Werttypen aufschlüsseln
Im dargestellten Codeausschnitt:
int[] myIntegers; myIntegers = new int[100];
Das Array myIntegers wird auf dem generiert Haufen. Entgegen der landläufigen Meinung sind die tatsächlich im Array gespeicherten ganzzahligen Werte nicht eingerahmt.
Klärung der Stack- und Heap-Zuordnung
Es besteht ein weit verbreitetes Missverständnis, dass Werttypen auf dem Array zugewiesen werden Stapel- und Referenztypen auf dem Heap sind nicht ganz korrekt. Alle lokalen Variablen und Parameter werden unabhängig vom Typ auf dem Stapel zugewiesen. Der Hauptunterschied liegt darin, was in diesen Variablen gespeichert ist:
Speicherzuweisung für Wert- und Referenztypen
Sowohl Wert- als auch Referenztypen belegen eine bestimmte Menge an Speicher, typischerweise 16 Bytes für die bereitgestellten Beispieltypen . Innerhalb dieses Speichers:
Beispiel: Stack und Heap Zuweisung
Berücksichtigen Sie die folgenden lokalen Variablen:
RefType refType; ValType valType; int[] intArray;
Anfänglich befinden sich nur ihre Referenzen auf dem Stapel und belegen 20 Bytes:
0 ┌───────────────────┐ │ refType │ 4 ├───────────────────┤ │ valType │ │ │ │ │ │ │ 20 ├───────────────────┤ │ intArray │ 24 └───────────────────┘
Bei der Zuweisung Werte zu diesen Variablen:
// Assign values to refType // ... // Assign values to valType // ... intArray = new int[4]; intArray[0] = 300; // ... intArray[3] = 303;
Die Stapeldarstellung würde ähneln:
0 ┌───────────────────┐ │ 0x4A963B68 │ -- heap address of `refType` 4 ├───────────────────┤ │ 200 │ -- value of `valType.I` │ 0x4A984C10 │ -- heap address of `valType.S` │ 0x44556677 │ -- low 32-bits of `valType.L` │ 0x00112233 │ -- high 32-bits of `valType.L` 20 ├───────────────────┤ │ 0x4AA4C288 │ -- heap address of `intArray` 24 └───────────────────┘
Sowohl das Array als auch die Wert- und Referenztypen belegen bestimmte Abschnitte des Heaps mit Speicherlayouts wie zuvor beschrieben.
Zusammenfassend ist das Array myIntegers wird auf dem Heap zugewiesen, während die darin gespeicherten einzelnen Ganzzahlwerte nicht eingerahmt sind. Sie werden einfach direkt im zugewiesenen Speicher auf dem Heap gespeichert, ohne dass sie in zusätzliche Objekte verpackt werden müssen.
Das obige ist der detaillierte Inhalt vonHeap- vs. Stack-Zuordnung: Wo befinden sich Arrays und Werttypen im Speicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!