2011-01-13 11 views

risposta

14

Per un CLR a 32 bit, entrambi avranno 4 byte per il blocco, 4 byte per il tipo di handle e 8 byte per i due pollici. L'array, tuttavia, avrà 4 byte in più per memorizzare la lunghezza (2 in questo caso), quindi l'array avrà 4 byte di overhead.

Dimensioni (determinato mediante profilatura) da 32 bit:
Tuple<int, int>: 16 byte
int[2]: 20 byte
int[1 to 2] *: 28 byte
int[2, 1]: 36 byte
In un 64-bit CLR:
Tuple<int, int>: 24 byte
int[2]: 32 byte
int[1 to 2] *: 40 byte
int[2, 1]: 48 byte

Si noti che gli array a valore zero basati su zero di tipi di valore sono gli array più piccoli possibili. L'utilizzo dei tipi di riferimento aggiunge altri 4 byte per il tipo di oggetto che viene archiviato (8 byte su 64 bit). L'utilizzo di basi di array diversi da zero o di più dimensioni consente di utilizzare un altro tipo di tipo di array che memorizza le informazioni di classifica e di limite inferiore, aggiungendo 8 byte aggiuntivi per dimensione.

Riferimenti:

* Non è possibile dichiarare un array con un non-0 limite inferiore in C#, così ho fatto la sintassi int[1 to 2]. Tuttavia, è possibile chiamare Array.CreateInstance(typeof(int), new[]{2}, new[]{10}); per creare un array con 2 elementi, all'indice 10 e 11. Ovviamente, poiché tali array non possono essere rappresentati direttamente nel sistema di tipi di C#, non sono terribilmente utili, ma forniscono un punto dati interessante.

+0

Gli array sono un caso speciale, anche quelli ottimizzati da IL, e quindi hanno un overhead aggiuntivo nella CLI stessa. –

0

A Tuple<int, int> utilizza la stessa memoria della classe con due campi interi. Un array, d'altro canto, ha una struttura dati interna abbastanza grande (chiamatanello SSCLI) che è almeno 32 byte più un'altra struttura dati (denominata ArrayOpIndexSpec) per ogni classificazione (in questo caso uno) di dimensione 16 byte. Quindi un array utilizza quasi sicuramente più fattori di memoria rispetto a uno Tuple.

+0

Il mio profilo su .Net 4 CLR mostra che anche un array multidimensionale è solo 20 o 24 byte più grande di una classe 2-int. – Gabe

+0

Dovrei averlo appena misurato prima invece di cercare di ragionare e speculare. Le mie misurazioni mostrano in .NET4 x86 CLR un int [2] consuma solo il ~ 20% di memoria in più rispetto a una tupla , coerente con la tua risposta. –

Problemi correlati