2010-08-24 25 views
11

Así, un par de preguntas, en realidad:¿Cuál es el tamaño de un Nullable <Int32>?

  1. Una se especifica int (Int32) sea (obviamente) de 32 bits. ¿Qué tal un int? (Nullable<int>)? Mi instinto me dice que serían 32 bits para el entero más 8 bits más para el booleano, pero tal vez la implementación sea más complicada que eso.
  2. Hubiera respondido mi propia pregunta usando sizeof(int?); pero como int? es un tipo gestionado, no está permitido. Entiendo que el tamaño de un tipo puede depender de la plataforma, y ​​que en el caso de los objetos que contienen referencias a otros objetos, una operación de tipo sizeof sería engañosa. Sin embargo, ¿hay alguna manera de obtener un tamaño de "línea de base" (es decir, cuál sería el tamaño de una instancia recién instanciada) para un tipo gestionado, dado el entorno actual?
+0

posible duplicado de [¿Cuál es la huella de memoria de un Nullable ] (http://stackoverflow.com/questions/1381308/what-is-the-memory-footprint-of-a-nullablet) –

Respuesta

6

Puedes echar un vistazo en ildasm o Reflector.

Si tiene dos campos: un bool y un T, entonces probablemente 8 bytes (suponiendo una alineación de 4 bytes).

+0

Agradable, aprendido algo nuevo con este!Tiene mucho sentido, pero no había considerado los problemas de alineación (supongo que eso es lo que sucede cuando ingresas al desarrollo de software al final del juego, sin una educación de CS). –

0

Considera el método Marshal.SizeOf. Permite obtener el tamaño de los tipos de valores gestionados. Es extraño, pero parece que el tamaño del tipo anulable es igual al tamaño de su parámetro de tipo (tamaño de int? Igual al tamaño de int, etc.)

+1

AFAIK no puede ordenar un valor que admite valores NULL. Por lo tanto, obtiene datos incorrectos. –

+2

La documentación de Microsoft dice: "Los tamaños no administrados y administrados de un objeto pueden diferir". - entonces este método no es confiable. – MarkusSchaber

2

Encontré un tratamiento exactamente para esta pregunta here, que incluye el código para una aplicación de consola simple para probar el uso de la memoria.

Básicamente,

... Esto indica que el tipo anulable envoltorio requiere 4 bytes de almacenamiento ...

6

Es más importante que nunca hacer una pregunta como esta, ya que no obtendrá una respuesta directa.

Pero ya que lo hizo de todos modos: el tamaño mínimo es de 0 bytes. Que obtendrá cuando el optimizador JIT se las arregla para mantener el valor en un registro de la CPU. El siguiente tamaño es de 2 bytes, para bool? y byte ?, 1 byte para HasValue, otro byte para el valor. Lo cual rara vez se obtiene porque las variables locales deben estar alineadas con una dirección que es un múltiplo de 4. Los 2 bytes extra de relleno nunca se usarán.

¿El siguiente tamaño es 3 para abreviar? y char ?, ahora obtendrás 1 byte de relleno.

¿Gran salto al siguiente, int? requiere 5 bytes pero el relleno aumenta eso a 8.

Etcétera. Éste se encuentra a cabo escribiendo un poco de código como este:

 int front = 42; 
     bool? center = null; 
     int back = 43; 
     Console.WriteLine("", front, center, back); 

Y mirando a las instrucciones de código máquina con el depurador. Tenga en cuenta que el ebp registra las compensaciones. Y ten en cuenta que la pila crece.

Cuestiones relacionadas