Qualcuno conosce la differenza di memoria tra questi due? O come lo si potrebbe capire facilmente da soli?Tuple <int, int> versus int [2] utilizzo memoria
risposta
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:
- http://www.codeproject.com/KB/dotnet/arrays.aspx
- http://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811
- http://msdn.microsoft.com/en-us/magazine/cc301755.aspx
* 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.
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
.
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
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
- 1. Usa List <tuple <int, int>> per tornare dati in Linq
- 2. lista <int> conversione a int []
- 3. mappa <int,int> valori predefiniti
- 4. Converti IEnumerable <int> in int []
- 5. convert IQueryable <int> a <int>
- 6. Assegnazione di std :: function <int(int)> a std :: function <const int & (const int & x)>
- 7. Intervallo di somma di int in Elenco <int>
- 8. Perché non `const int ci = 2; std :: forward <int> (ci); `funziona e come risolvere/risolvere il problema?
- 9. efficiente della memoria int-int dict in Python
- 10. Dividi stringa nell'Elenco <int> ignora nessun valore int
- 11. Come funziona ObservableCollection <T> .Move (int, int)?
- 12. metodo che accetta sia int [] e Lista <int>
- 13. rapida Gamma convertito <Int> a [Int]
- 14. Impossibile convertire il tipo 'System.Linq.IQueryable <int>' a 'int'
- 15. Memorizza int in 2 caratteri
- 16. Utilizzo di int vs Integer
- 17. Ordina un Dizionario <int, Lista <int>> con i tasti + valori elenco all'interno
- 18. problema con Joda nuovo DateTime (int, int, int, int, int, int)
- 19. A cosa serve `std :: tupla <int[N]>`?
- 20. EJS: <% = versus <% -
- 21. Come convertire System.Linq.Enumerable.WhereListIterator <int> in Elenco <int>?
- 22. int ** vs int [FILE] [COLS]
- 23. const int = int const?
- 24. Trattore vettoriale <int*> come vettore <const int*> senza copiare (C++ 0x)
- 25. In Javascript, <int-value> == "<int-value>" è true. Perché è così?
- 26. emplace_back non funziona con std :: vector <std :: map <int, int>>
- 27. Confronta due liste <int>
- 28. Utilizzo della variabile const int nell'istruzione switch
- 29. Arrotondamento con static_cast <int>?
- 30. Vettore di ritorno <coppia <int,int>> & dal metodo C++ alla lista python di tuple usando la typemap di swig
Gli array sono un caso speciale, anche quelli ottimizzati da IL, e quindi hanno un overhead aggiuntivo nella CLI stessa. –