¿Por qué un System.Boolean toma 4 bytes? Simplemente almacena un estado, ya sea verdadero o falso, que se puede almacenar en menos espacio que 4 bytes.¿Por qué hay un booleano de 4 bytes en .NET?
Respuesta
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.
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.
toque con la URL :) primera respuesta Google – Tom
de hoy es esta pregunta. Dado que las preguntas se archivan, agregue también el enlace específico en el futuro. – Blaisorblade
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
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.
Creo que es solo por el rendimiento, los valores de 32 bits son mucho más eficientes de manipular.
¿De dónde sacaste eso? System.Boolean solo toma byte.
sólo tratar:
Console.WriteLine(sizeof(System.Boolean).ToString());
Compruebe el tamaño una vez que se haya calculado el tipo: Console.Write (System.Runtime.InteropServices.Marshal.SizeOf (new System.Boolean())); – CMS
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
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
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());
}
- 1. ¿Por qué mode_t usa 4 bytes?
- 2. ¿Qué hay de nuevo en .net 4 para MVVM?
- 3. Android - ¿Por qué onItemLongClick (...) devuelve un booleano?
- 4. ¿Por qué XmlDocument no es dinámico en .NET 4?
- 5. ¿Por qué el comportamiento BeforeFieldInit cambia en .NET 4?
- 6. ¿Hay un literal booleano en SQLite?
- 7. ¿Por qué Y dos números para obtener un booleano?
- 8. ¿Por qué alguien debería usar .NET Framework 4 Client Profile?
- 9. ¿Por qué gdb me dice que un puntero tiene 4 bytes en x86-64?
- 10. Guid de orden de bytes en .NET
- 11. int es de 4 bytes, pero todavía se puede almacenar en una charla por qué no hay desbordamiento
- 12. ¿Por qué hay interfaces en tipos de referencia .Net?
- 13. ¿Por qué la memoria direccionable por byte y no la memoria de 4 bytes direccionables?
- 14. Cómo asegurarse de que un int es de 4 bytes o 2 bytes en C/C++
- 15. ¿Por qué Interlocked.Exchange no es compatible con el tipo booleano?
- 16. StackOverflowException en .NET 4
- 17. Convertir 4 bytes a int
- 18. ¿Por qué no hay una cola genérica sincronizada en .NET?
- 19. ¿Por qué no hay una interfaz "configurada" en .NET Framework?
- 20. ¿Por qué no hay SortedList <T> en .NET?
- 21. ¿Por qué no hay CallerTypeNameAttribute en .NET 4.5?
- 22. Como IPV6 necesita 128 bits (16 bytes), ¿por qué en postgres el tipo de datos CIDR tiene un almacenamiento de 24 bytes (8.1) y 19 bytes (9.1)?
- 23. ¿Puedo serializar un ExpandoObject en .NET 4?
- 24. ¿Por qué veo una marca de orden de bytes en mi servicio web .NET de repente?
- 25. ¿por qué sizeof (13.33) tiene 8 bytes?
- 26. ¿Por qué no hay isFocused() en GWT?
- 27. por qué el tamaño de referencia es siempre de 4 bytes - C++
- 28. Inicialización lenta en .NET 4
- 29. Formato UUID: 8-4-4-4-12 - ¿Por qué?
- 30. C# Big-endian ulong de 4 bytes
Incluso Nullable solo usará hasta dos bytes en algunos casos, por ejemplo, si tiene una matriz de ellos. –
Sí, tienes razón. Hubiera esperado que alineara índices de matriz por el rendimiento, pero parece que no. –
+1, su respuesta es tan buena que otros usuarios la están robando. – Will