2013-07-19 6 views
22

Ich lerne gerade C# und untersuche Datentypen.Warum ist die Größe eines Bool-Datentyps nicht nur 1 Bit in C#?

Warum ist kein bool Datentyp 1 Bit groß?

Es scheint, dass es nur einen von zwei Werten (wahr oder falsch) enthalten kann, also würde das nicht nur 1 Bit Platz einnehmen, um diesen Wert darzustellen?

Liegt es daran, dass die kleinste adressierbare Größe eines Wertes ein Byte (8 Bits) ist, wie in this post beschrieben?

Mein Gesamtziel war es, logisch die unterschiedliche Größe jedes Datentyps in C# zu sehen, also habe ich versucht, eine Liste aller Datentypen und ihrer zugewiesenen Bitgröße zu erstellen, und das warf mich.

+0

[This] (http://stackoverflow.com/a/2308052/1324033) kann Ihnen helfen – Sayse

+0

Mögliche Duplikate von [Warum in .NET System.Boolean dauert 4 Byte?] (Https: // stackoverflow .com/questions/294905/why-in-net-system-boolean-takes-4-byte) –

+0

Diese Frage wurde vor 4 Jahren gestellt und hat einige wertvolle Antworten, es wäre schade, wenn sie als Duplikat entfernt würde. – user1063287

Antwort

23

Ist es, weil die kleinste ‚adressierbar‘ Größe eines Wertes ein Byte

Yep ist, genau die gleiche Sache . Damit die CLR effizient ist, ordnet sie ihre Datentypen ähnlich wie der Compiler in C++ (so ziemlich) den nativen Maschinendatentypen zu.

+0

Und es macht überhaupt keine Verpackung - also könnte die Verwendung von 8 Bools * als ein einzelnes Byte dargestellt werden; aber das ist es nie. Pascal ist ein Beispiel für eine Sprache, die das für Sie erledigt, aber .NET macht das sicher nicht. – Luaan

3

Wenn Sie viele Flags platzsparend speichern möchten, sollten Sie Int32 oder Int64 als Bitmaske verwenden. Auf diese Weise können Sie 32 oder 64 boolesche Flags in einem 32/64-Bit-Datentyp speichern. Sie müssen Bitmask-Tests durchführen, um Werte zu überprüfen oder festzulegen. Es entstehen also geringe Zusatzkosten für den Zugriff oder die Aktualisierung über eine boolesche Variable.

Die Größe eines booleschen Feldes im Speicher beträgt 1 Byte und einer booleschen Variablen 4 Byte.

BitArray ist auch praktisch für mit vielen Bitflags tun: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

Wo finden Sie die Größe einer booleschen Variablen zu 4 Bytes? – Tyler

+1

@Tyler http://StackOverflow.com/Questions/294905/Why-in-Net-System-Boolean-Takes4-byte –

+0

Sie sollten sagen, ein Maximum von 4 Bytes, denn es kann nicht tatsächlich bis 4 Bytes. – Tyler

1

Das ist mir auch aufgefallen ... Ich habe zwei Arrays erstellt: float [4000] und float? [4000]. Das zweite Array benötigt doppelt so viel Speicherplatz wie float? ist implementiert als float und bool, und der bool endet mit 32 bit genauso wie der float.

Also, wenn Speicherbelegung ein Anliegen ist, ist die Verwendung eines NaN-Float-Wert, um "Null" in einem float [] darzustellen, besser als die Verwendung eines float? [].

Ich fühle mich wie ein Idiot in all den Jahren, in denen ich versucht habe, kleinere Datentypen zu verwenden, weil ich glaubte, dass es tatsächlich gut war! :-)

Verwandte Themen