Wie groß ist eine Objektreferenz in .NET?


Antworten:


84

Die Referenz selbst ist im Grunde ein Zeiger. 32 Bit unter einem 32-Bit-Betriebssystem, 64 Bit unter einem 64-Bit-Betriebssystem.

Die Größe des Objekts, auf das verwiesen wird, ist komplizierter.


1
Ich frage mich, warum 64-Bit-.net einen Zeiger anstelle eines skalierten Offsets in eine "Objekte" -Tabelle verwendet hätte. Ein skalierter 32-Bit-Offset hätte für die meisten Anwendungen ausreichen müssen (Anwendungen, die mehr als vier MILLIARDEN Objekte benötigen, könnten ein spezielles "superHumungous" -Speichermodell verwenden), und ich würde denken, dass die geringen zusätzlichen Kosten für die Verwendung der skalierten Verschiebungsadressierung höher wären als durch die verbesserte Cache-Parallelität ausgeglichen, die sich daraus ergeben würde, dass Objektreferenzen halb so groß werden.
Supercat

5
@supercat, .NET-Entwickler können ihre App im 32-Bit-Modus kompilieren. Alle Zeiger sind 32-Bit. Dies ist wahrscheinlich am besten für Anwendungen geeignet, die keine 64-Bit-Zeiger benötigen. Dies ist die überwiegende Mehrheit der Anwendungen.
Samuel Neff

1
@SamuelNeff: Nach anderen Informationen, die ich gelesen habe, bieten 64-Bit-Anwendungen eine bessere Leistung, da der 64-Bit-Befehlssatz die Verwendung von mehr Registern ermöglicht und im Allgemeinen effizienter ist. Ich würde denken, dass die Verwendung von 32-Bit-Objektreferenzen die Leistung noch weiter verbessern würde.
Supercat

1
@supercat, es gibt viele widersprüchliche Beiträge zur 32-Bit- und 64-Bit-Leistung. Hier ist eine, die 32-Bit stark bevorzugt. blogs.msdn.com/b/ricom/archive/2009/06/10/…
Samuel Neff

2
@SamuelNeff: Während die ursprüngliche Frage mit "4 Bytes auf x86; 8 Bytes auf x64" beantwortet werden konnte, wäre diese Frage an und für sich nicht sehr interessant oder aufschlussreich. Etwas aufschlussreicher erscheint es, zu wissen, welche Auswirkungen 8-Byte-Objektreferenzen auf die Leistung haben.
Supercat

21

Zum Bestimmen der Zeigergröße können Sie System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr))oder sizeof(IntPtr)in einem unsicheren Kontext verwenden.

Bearbeiten:

Oder IntPtr.Size.


16

Eine Objektreferenz ist im Grunde ein Zeiger auf den Speicher, der die Attribute des Objekts enthält. Als solche ist die Referenz ein Prozessorwort lang - 32 Bit auf 32-Bit-Plattformen und 64 Bit auf x64.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.