2013-07-19 9 views
22

Sto solo imparando C# e approfondendo i tipi di dati.Perché la dimensione di un tipo di dati bool non è di solo 1 bit in C#?

Perché il tipo di dati bool non è di 1 bit?

Sembra che possa contenere solo uno dei due valori (vero o falso), quindi non richiederebbe solo 1 bit di spazio per rappresentare tale valore?

È perché la più piccola dimensione "indirizzabile" di un valore è un byte (8 bit) come indicato in this post?

Il mio obiettivo generale era di prevedere logicamente le diverse dimensioni di ogni tipo di dati in C# così stavo cercando di creare un elenco di tutti i tipi di dati e la loro dimensione di bit allocata e questo mi ha gettato.

+0

[Questo] (http://stackoverflow.com/a/2308052/1324033) può essere d'aiuto – Sayse

+0

Possibile duplicato di [Perché in .NET System.Boolean richiede 4 byte?] (Https: // stackoverflow .com/questions/294905/why-in-net-system-boolean-takes-4-byte) –

+0

Questa domanda è stata posta 4 anni fa e ha alcune risposte valide, sarebbe un peccato se fosse stata rimossa come duplicato. – user1063287

risposta

23

Forse perché la più piccola dimensione 'indirizzabile' di un valore è un byte

Sì, esattamente la stessa cosa . Affinché il CLR sia efficiente, associa i suoi tipi di dati ai tipi di dati macchina nativi più o meno allo stesso modo del compilatore in C++ (praticamente).

+0

E non fa alcun impacchettamento, mai - quindi usare 8 bools * potrebbe * essere rappresentato come un singolo byte; ma non lo è mai. Pascal è un esempio di linguaggio che gestisce quello per te, ma .NET sicuramente non lo fa. – Luaan

3

Se si desidera archiviare molti flag in modo efficiente in termini di spazio, considerare l'utilizzo di Int32 o Int64 come maschera di bit, in questo modo è possibile memorizzare 32 o 64 flag booleani in un tipo di dati 32/64 bit. Devi fare test sulla maschera di bit per controllare o impostare valori, quindi c'è un piccolo costo aggiuntivo per accedere o aggiornare, su una variabile booleana.

La dimensione di un campo booleano in memoria è 1 byte e di una variabile booleana 4 byte.

BitArray è utile anche per trattare con un sacco di bandiere bit: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Dove trovi la dimensione di una variabile booleana di 4 byte? – Tyler

+1

@Tyler http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte –

+0

Dovresti dire un massimo di 4 byte perché in realtà non può finire per occupare 4 byte. – Tyler

1

Ho notato anche questo ... Ho creato due array: float [4000] e float? [4000]. Il secondo array occupa il doppio dello spazio di memoria perché float? è implementato come float e bool e il bool finisce per prendere 32 bit esattamente come fa il float.

Quindi, alla fine, se l'utilizzo della memoria è un problema, usare un valore float NaN per rappresentare "null" in un float [] è meglio che usare un float? [].

Mi fa sentire un idiota per tutti gli anni in cui ho provato a utilizzare tipi di dati più piccoli ritenendo che in realtà stessero facendo del bene! :-)