2010-09-27 14 views
54

Qual è la dimensione di un riferimento a un oggetto in .NET? Varia tra la compilazione x86, x64 e/o AnyCPU?Quanto è grande un riferimento a un oggetto in .NET?

Se fa la differenza, sono personalmente interessato a C#.

+6

Non un duplicato - sto parlando del riferimento stesso – arootbeer

+0

[vedi domanda relativa] [1] [1]: http://stackoverflow.com/questions/26570/sizeof-equivalent- per-reference-types –

+0

possibile duplicato di [C# riferimento variabile allocazione mem] (http://stackoverflow.com/questions/489805/c-sharp-reference-variable-mem-allocation) – nawfal

risposta

56

Il riferimento stesso è fondamentalmente un puntatore. 32 bit su un sistema operativo a 32 bit, 64 bit su un sistema operativo a 64 bit.

La dimensione dell'oggetto a cui si fa riferimento è più complicata.

+0

Questo è quello che ho capito - volevo solo per assicurarmi che non ci fossero più cose all'interno del runtime – arootbeer

+0

Mi chiedo perché 64-bit .net avrebbe usato un puntatore, piuttosto che un offset scalato in una tabella "oggetti"? Un offset scalato a 32 bit avrebbe dovuto essere sufficiente per la maggior parte delle applicazioni (le applicazioni che richiedono più di quattro miliardi di oggetti potrebbero utilizzare uno speciale modello di memoria "superumiducente") e penserei che il piccolo costo aggiuntivo dell'uso dell'indirizzamento di spostamento in scala sarebbe più compensato dal miglioramento della concorrenza della cache che risulterebbe dal fare riferimento a oggetti di dimensioni uguali. – supercat

+2

@supercat, gli sviluppatori .NET possono scegliere di compilare la loro app in modalità a 32 bit e tutti i puntatori saranno a 32 bit. Questo è probabilmente il migliore per qualsiasi applicazione che non abbia bisogno di puntatori a 64 bit, che è la stragrande maggioranza delle applicazioni. –

14

Un riferimento oggetto è fondamentalmente un puntatore alla memoria che contiene gli attributi dell'oggetto. Di conseguenza, il riferimento è costituito da una sola parola del processore: 32 bit su piattaforme a 32 bit e 64 bit su x64.

+0

C'è un modo per misurare la quantità di memoria che un ** oggetto * consuma? – Shimmy

17

Per determinare la dimensione del puntatore, è possibile utilizzare System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr)) o sizeof(IntPtr) in un contesto non sicuro.

Edit:

Or IntPtr.Size.

Problemi correlati