¿Alguien sabe la diferencia de memoria entre estos dos? ¿O cómo uno podría descubrirlo fácilmente ellos mismos?Tuple <int, int> versus int [2] uso de memoria
Respuesta
Para un CLR de 32 bits, ambos tendrán 4 bytes para el bloqueo, 4 bytes para el manejador de tipo y 8 bytes para los dos niveles. La matriz, sin embargo, tendrá 4 bytes adicionales para almacenar la longitud (2 en este caso), por lo que la matriz tendrá una sobrecarga de 4 bytes.
Tamaños (determinado por perfiles) en 32 bits:
Tuple<int, int>
: 16 bytes
int[2]
: 20 bytes
int[1 to 2]
*: 28 bytes
int[2, 1]
: 36 bytes
En un CLR 64 bits:
Tuple<int, int>
: 24 bytes
int[2]
: 32 bytes
int[1 to 2]
*: 40 bytes
int[2, 1]
: 48 bytes
Tenga en cuenta que las matrices monodimensionales de tipos de valores basados en cero son las matrices más pequeñas posibles. El uso de tipos de referencia agrega otros 4 bytes para el tipo de objeto que se está almacenando (8 bytes en 64 bits). El uso de bases de matriz que no sean cero o múltiples dimensiones lo hace usar otro tipo de tipo de matriz que almacena la información de rango y de límite inferior, agregando 8 bytes adicionales por dimensión.
Referencias:
- 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
* No se puede declarar una matriz con un no-0 con destino en C# menor, por lo que constituían la sintaxis int[1 to 2]
. Sin embargo, puede llamar al Array.CreateInstance(typeof(int), new[]{2}, new[]{10});
para crear una matriz con 2 elementos, en el índice 10 y 11. Por supuesto, como dichas matrices no pueden representarse directamente en el sistema de tipos de C#, no son terriblemente útiles, pero proporcionan un punto de datos interesante.
A Tuple<int, int>
usa la misma memoria que la clase con dos campos enteros. Una matriz, por otro lado, tiene una estructura de datos interna bastante grande (llamada ArrayOpScript
en el SSCLI) que tiene al menos 32 bytes más otra estructura de datos (llamada ArrayOpIndexSpec
) para cada rango (en este caso uno) de tamaño 16 bytes. Entonces, una matriz casi seguramente usa varios factores más memoria que un Tuple
.
Mi perfil en .NET 4 CLR muestra que incluso una matriz multidimensional es solo 20 o 24 bytes más grande que una clase 2-int. – Gabe
Debería haberlo medido primero en lugar de tratar de razonar y especular. Mis medidas se muestran en .NET4 x86 CLR an int [2] consume solo ~ 20% más de memoria que un Tuple
- 1. Lista de clasificación <Tuple <int, int>> in situ
- 2. Math.random() versus Random.nextInt (int)
- 3. ¿Qué significa "int * a = (int [2]) {0, 2};" exactamente hacer?
- 4. map <int,int> valores predeterminados
- 5. Convierte IEnumerable <int> en int []
- 6. lista <int> convertir a int []
- 7. convertir IQueryable <int> a <int>
- 8. IList <int> vs Lista <int>
- 9. problema joda nueva DateTime (int, int, int, int, int, int)
- 10. ¿Hay alguna diferencia entre std :: map <int, int> y std :: map <const int, int>?
- 11. Usando Environment.ExitCode versus return int desde Main
- 12. tipo de int * (*) (* int, int * (*)())
- 13. C# int Formato ToString en 2 char int?
- 14. Linux: matriz int grande: mmap versus archivo de búsqueda?
- 15. ¿Cómo funciona ObservableCollection <T> .Move (int, int)?
- 16. Int Int Int y volver
- 17. Nullable <int> vs. int? - ¿Hay alguna diferencia?
- 18. static_cast <int> (foo) vs. (int) foo
- 19. ¿Por qué `const int ci = 2; std :: forward <int> (ci); `trabajo y cómo solucionarlo/solucionarlo?
- 20. int vs const int &
- 21. BOOST_CHECK_EQUAL con el par <int, int> y el operador personalizado <<
- 22. std :: pair <int, int> vs struct con dos int
- 23. Cómo convertir System.Linq.Enumerable.WhereListIterator <int> en la lista <int>?
- 24. int ** vs int [FILAS] [COLS]
- 25. Trate el vector <int*> como vector <const int*> sin copiar (C++ 0x)
- 26. ¿Cuál es el equivalente de map <int, vector <int>> en Python?
- 27. 32bit int * 32bit int = 64 bit int?
- 28. vector <int> :: size_type en C++
- 29. const int = int const?
- 30. Explicación de int? vs int
Las matrices son un caso especial, incluso las optimizadas IL, por lo que tienen una sobrecarga adicional en la propia CLI. –