Wie groß ist eine Objektreferenz in .NET?

77

Wie groß ist eine Objektreferenz in .NET? Unterscheidet es sich zwischen x86-, x64- und / oder AnyCPU-Kompilierung?

Wenn es einen Unterschied macht, bin ich persönlich an C # interessiert.

Arootbeer
quelle
[siehe verwandte Frage] [1] [1]: stackoverflow.com/questions/26570/…
Tim Hoolihan
Mögliches Duplikat der Mem-Zuordnung
-Referenzvariablen

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.

Samuel Neff
quelle
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.

IllidanS4 unterstützt Monica
quelle
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.

Igor Zevaka
quelle