2011-01-13 7 views

Respuesta

14

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:

* 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.

+0

Las matrices son un caso especial, incluso las optimizadas IL, por lo que tienen una sobrecarga adicional en la propia CLI. –

0

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.

+0

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

+0

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 , de acuerdo con su respuesta. –

Cuestiones relacionadas