2010-09-27 17 views
54

Wie groß ist eine Objektreferenz in .NET? Variiert es zwischen x86, x64 und/oder AnyCPU Compilierung?Wie groß ist eine Objektreferenz in .NET?

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

+6

kein Duplikat - ich spreche über die Referenz selbst – arootbeer

+0

[Frage im Zusammenhang sehen] [1] [1]: http://stackoverflow.com/questions/26570/sizeof-equivalent- for-reference-types –

+0

mögliches Duplikat von [C# reference variable mem allocation] (http://stackoverflow.com/questions/489805/c-sharp-reference-variable-mem-allocation) – nawfal

Antwort

56

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

Die Größe des referenzierten Objekts ist komplizierter.

+0

Das habe ich mir gedacht - ich wollte nur um sicherzustellen, dass es nicht mehr in der Laufzeit – arootbeer

+0

ging Ich frage mich, warum 64-Bit-.net hätte einen Zeiger, anstatt eine skalierte Offset in eine Tabelle "Objekte" verwendet? Ein skalierter 32-Bit-Offset hätte für die meisten Anwendungen ausreichen müssen (Anwendungen, die mehr als vier BILLION-Objekte benötigen, könnten ein spezielles "superhumungöses" Speichermodell verwenden), und ich würde denken, dass die zusätzlichen Kosten für die Verwendung skalierter Verschiebungsadressierung geringer wären als durch die verbesserte Cache-Nebenläufigkeit ausgeglichen, die sich aus der Hälfte der Objektreferenzen ergeben würde. – supercat

+2

@supercat, .NET-Entwickler können wählen, ihre App im 32-Bit-Modus zu kompilieren und alle Zeiger werden 32-Bit sein. Dies ist wahrscheinlich am besten für jede Anwendung, die keine 64-Bit-Zeiger benötigt, was die überwiegende Mehrheit der Anwendungen ist. –

14

Ein Objektverweis ist im Grunde ein Zeiger auf den Speicher, der die Attribute des Objekts enthält. Daher ist die Referenz ein Prozessorwort in der Länge - 32 Bits auf 32-Bit-Plattformen und 64 Bits auf x64.

+0

Gibt es eine Möglichkeit zu messen, wie viel Speicher ein ** "Objekt" ** verbraucht? – Shimmy

17

Zur Bestimmung der Zeigergröße können Sie System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr)) oder sizeof(IntPtr) in unsicherem Kontext verwenden.

Edit:

Oder IntPtr.Size.

Verwandte Themen