sábado, 6 de julio de 2013

Null y Sobrecarga de Almacenamiento en C#

Tabla de Contenido

0. Palabras Clave
1. Introducción
2. null
3. Sobrecarga de almacenamiento
4. Conclusiones
5. Literatura & Enlaces

0. Palabras Clave

  • Excepción
  • Multithreading
  • NullReferenceException

1. Introducción

En este artículo se describe varios de los detalles más importantes acerca del uso de la construcción null: utilizada para la representación que un identificador no apunta a ningún objeto en la memoria principal del sistema. Además, se hace un breve esbozo de la sobrecarga de almacenamiento de tipos de datos en memoria principal.

Se hace énfasis a la clase Punto:

2. null

null es una literal que permite ser asignada a variables de tipos de datos por referencia. Su utilidad es hacer que una referencia apunte haga referencia a ningún objeto en la memoria de trabajo, aclarando que esto esta operación no eliminará ni el objeto ni sus datos asociados. En el siguiente ejemplo se resalta el uso de null:

Archivo C# NullPrueba.cs [Enlace alternativo]:

En la línea 7 el valor del resultado de la evaluación de la expresión punto == null es true, esto ocurre así porque la referencia punto no apunta a ningún objeto (ver línea 5: Punto punto = null;).

En la línea 12 Console.WriteLine(punto.X);, generará una excepción cuando se intenta acceder al miembro X. Mientras que no se asigne una referencia distinta de null a punto;, la CLR reportará la excepción NullReferenceException [3].

3. Sobrecarga de Almacenamiento

De acuerdo con Albahari [2012] las instancias de tipos de datos por valor ocupan exactamente la memoria requerida para almacenar sus campos. Por ejemplo, la estructura tipo por valor Punto ocupa 8 bytes (cada campo int ocupa 4 bytes) en memoria.

Por otra parte, la complejidad inherente de los tipos por referencia requieren de dos ubicaciones de memoria separadas: una para el objeto (sus datos asociados, inclusive del espacio necesario para la sobrecarga administrativa) y la misma referencia.

Nota

La CLR se encarga de posicionar cada campo de la estructura en memoria. Por ejemplo, los tipos long ocupan espacio de memoria que sean múltiplos de 8. En la estructura A, el campo b genera un desperdicio de 7 bytes, debido a que el campo l no puede ser ubicado contiguamente (para más información ver StackOverflow [ref. 4]).

Adicionalmente, la sobrecarga para objetos es dependiente de la implementación de la máquina virtual de .NET, pero es común 8 bytes de sobrecarga utilizados para:
  • almacenar el hash para el tipo del objeto (estado de bloqueo útil para programas que requieran multithreading), y
  • almacenar el estado del coleccionador de basura.
Por otro lado, cada referencia necesita 4 u 8 bytes (dependiendo de la plataforma (32 o 64 bits) en que la máquina virtual de .NET se esté ejecutando) extras.

4. Conclusiones

En este artículo se distinguió la utilidad de la literal null para hacer que una referencia no apunte a ningún objeto y apropiando al programador de un medio idóneo para deshacerse de referencias no útiles en el flujo de ejecución del programa. Al final, se discutió tanto el espacio que consumen en memoria de trabajo los tipos de datos primitivos como también las referencias.

5. Literatura & Enlaces

[1]: null - http://msdn.microsoft.com/en-us/library/edakx9da.aspx
[2]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[3]: NullReferenceException - http://msdn.microsoft.com/en-us/library/system.nullreferenceexception.aspx
[4]: Why storage overhead generates waste in C# data types? - http://stackoverflow.com/questions/17504491/why-storage-overhead-generates-waste-in-c-sharp-data-types


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.