ejemplo - ¿Por qué hay un booleano de 4 bytes en.NET?
boolean ejemplo (6)
¿De dónde sacaste eso? System.Boolean toma solo 1 byte.
Sólo inténtalo:
Console.WriteLine( sizeof( System.Boolean ).ToString() );
¿Por qué un System.Boolean toma 4 bytes? Simplemente almacena un estado, verdadero o falso , que podría almacenarse en menos espacio que 4 bytes.
Creo que es solo por el rendimiento, los valores de 32 bits son mucho más eficientes de manipular.
El primer resultado en una búsqueda de Google para System.Boolean size me dijo que tiene que ver con la alineación de la memoria. Es más rápido presionar alrededor de un Int32 de cuatro bytes que trabajar con bytes / bits individuales.
Porque es rápido
Un procesador de 32 bits normalmente funciona con valores de 32 bits. Trabajar con valores más pequeños implica instrucciones más largas o lógica adicional.
Un bool
es en realidad solo 1 byte, pero la alineación puede hacer que se utilicen 4 bytes en una plataforma de 32 bits, o incluso 8 bytes en una plataforma de 64 bits. Por ejemplo, el tipo Nullable<bool>
(también conocido como bool?
) Usa 32 o 64 bits completos, según la plataforma, aunque solo consta de dos bool
. EDITAR : Como señaló Jon Skeet, el relleno para la alineación no siempre está presente. Como ejemplo, una matriz de Nullable<bool>
s toma solo 2 bytes por objeto en lugar de 4 u 8.
Pero incluso 8 bits para representar un bool
pueden considerarse un desperdicio si tiene muchos de ellos para almacenar. Por esta razón, si crea un tipo que tiene muchos elementos como miembros (o usa muchos tipos Nullable<>
) y los usuarios de su clase pueden crear muchas instancias del mismo, puede considerar usar un BitVector32
en BitVector32
lugar. El marco en sí mismo usa esta técnica para reducir la huella de memoria de muchos de los controles de Windows Forms, por ejemplo.
Usé el siguiente código para crear un par de matrices y probarlas. ¿flotante? [100000] usa el doble de memoria que el flotador [100000]. Esto es porque el bool que acompaña al flotador en el flotador? el caso se alinea a 32 bits (al menos en mi máquina ;-))
long startMem = 0, stopMem = 0;
DateTime startTime = DateTime.Now;
private void StartMemoryUsage()
{
GC.Collect();
GC.Collect();
startMem = GC.GetTotalMemory(true);
startTime = DateTime.Now;
}
private void StopMemoryUsage()
{
GC.Collect();
GC.Collect();
stopMem = GC.GetTotalMemory(true);
Console.WriteLine("---> {0} sec. Using {1} KB.", (DateTime.Now - startTime).TotalSeconds, ((stopMem - startMem) / 1000).ToString());
}