2008-11-17 20 views

Respuesta

50

A bool es en realidad sólo 1 byte, pero alineación puede causar 4 bytes que deben utilizarse 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?) utiliza 32 o 64 bits completos, según la plataforma, aunque solo consta de dos bool s. EDIT: Como señaló Jon Skeet, el relleno para la alineación no es siempre presente. A modo de ejemplo, una serie de Nullable<bool> s tarda sólo 2 bytes por objeto en lugar de 4 o 8.

Pero incluso 8 bits para representar un bool se puede considerar un desperdicio si usted tiene muchos de ellos a la tienda. Por esta razón, si crea un tipo que tiene muchos bool como miembros (o usa muchos tipos de Nullable<>), y los usuarios de su clase pueden crear muchas instancias de este, puede considerar usar un BitVector32 en su 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.

+3

Incluso Nullable solo usará hasta dos bytes en algunos casos, por ejemplo, si tiene una matriz de ellos. –

+0

Sí, tienes razón. Hubiera esperado que alineara índices de matriz por el rendimiento, pero parece que no. –

+2

+1, su respuesta es tan buena que otros usuarios la están robando. – Will

6

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.

+0

toque con la URL :) primera respuesta Google – Tom

+4

de hoy es esta pregunta. Dado que las preguntas se archivan, agregue también el enlace específico en el futuro. – Blaisorblade

+0

La única razón por la que no busqué la búsqueda en google es porque me estaba remitiendo a la misma página de stackoverflow;) – Sun

13

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.

1

Creo que es solo por el rendimiento, los valores de 32 bits son mucho más eficientes de manipular.

1

¿De dónde sacaste eso? System.Boolean solo toma byte.

sólo tratar:

Console.WriteLine(sizeof(System.Boolean).ToString()); 
+0

Compruebe el tamaño una vez que se haya calculado el tipo: Console.Write (System.Runtime.InteropServices.Marshal.SizeOf (new System.Boolean())); – CMS

+0

que es lo que no deberías hacer. La mayoría de las API no administradas usan * int * para valores BOOL, Marhsal.SizeOf() te dice el tamaño de un tipo * no administrado *. – arul

+0

Marshalling a bool es un poco más complicado que eso. Hice una publicación en el blog sobre este tema que cubre los diversos tamaños: http://blogs.msdn.com/jaredpar/archive/2008/10/14/pinvoke-and-bool-or-should-i-say-bool. aspx – JaredPar

0

Utilicé 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? 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()); 
} 
Cuestiones relacionadas