c# - titel - title tag definition




Wie viele Bytes werden für 3-Punkt-Strukturen auf einem 64-Bit-Prozessor zugewiesen? (2)

Apropos x86 Architektur, die Antwort von 44 Bytes ist nicht korrekt, da die Objektreferenzgröße in x86 4 Byte und nicht 8 Byte beträgt, also die Objektlänge von 36 Byte + 4 Byte Verweis auf das Objekt ergibt 40 Byte . Korrigiere mich, wenn ich falsch liege.

Es gibt eine Frage:

Gegeben:

struct Point {int x; int y;}
var p = new Point[3]

Wie viele Bytes Speicher werden im Stack und im Heapspeicher zugewiesen, wenn wir einen 64-Bit-Prozessor verwenden?

Die richtige Antwort für .Net ist 44 . Kann jemand erklären, wie diese Nummer erschienen ist?

Soweit ich verstehe, belegt p 8 Bytes im Stack für x64 .

Und wir haben zwei Werte von Int32 pro Struktur, also p.Length * sizeof(Point) 3 * 8 = 24 Bytes im Heap für ein Array.

Das wird 32 Bytes sein . Was ist der Rest 12 Bytes in diesem Fall?


Ihre Antwort von 44 Bytes ist wahrscheinlich eine Verwirrung, die sich auf ein Array von 32-Bit-Architektur bezieht.

In .Net (32 Bit) :

  • Jedes object enthält 4 Bytes für die Synchronisation ( lock (obj) ).
  • Jedes object enthält 4 Bytes seines Typs Token.
  • Jedes array enthält 4 Bytes seiner Länge.

Der Zeiger ist 8 Bytes wie du gesagt hast.

Dies mit den 24 Bytes des Arrays selbst gibt Ihnen 44 Bytes .

Dies ist jedoch das Header-Layout für 32 Bit.

Wie Sie sehen können, ist das Speicherlayout des folgenden Codes:

var p = new Point[3];
p[0] = new Point { x = 1, y = 2 };
p[1] = new Point { x = 3, y = 4 };
p[2] = new Point { x = 5, y = 6 };

var p2 = new Point[3];
p2[0] = new Point { x = 8, y = 8 };
p2[1] = new Point { x = 8, y = 8 };
p2[2] = new Point { x = 8, y = 8 };

Wird sein:

Sie können die Zahlenwerte auch im Speicherlayout sehen.

In 64 Bit nimmt jedes Feld des Headers 8 Bytes, so dass die Headerlänge 24 Bytes beträgt, daher beträgt die Länge des gesamten Arrays 48 Bytes und mit der Variablen, die auf das Array zeigt: 56 Bytes .

64-Bit-Architektur-Speicherlayout:

Anmerkungen:

  • Wenn Ihr Array nicht auf 8 Byte aufgerundet wurde, würde eine Mehrfachausrichtung stattfinden, aber es ist keine Ausrichtung erforderlich. Beispiel (zwei 1-dimensionale int Arrays) :

  • Obwohl das Längenfeld des Headers 8 Byte in 64 Bit ist, ist es größer als die maximale Array-Größe, die .NET erlaubt, daher können nur 4 verwendet werden.

Beachten Sie, dass dies ein Implementierungsdetail ist und sich möglicherweise zwischen Implementierungen / Versionen der CLR ändert.





struct