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.
@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.
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.
Antworten:
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.
quelle
Zum Bestimmen der Zeigergröße können Sie
System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr))
odersizeof(IntPtr)
in einem unsicheren Kontext verwenden.Bearbeiten:
Oder
IntPtr.Size
.quelle
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.
quelle