Frage

Warum wird ein Boolean verbrauchen 4 Byte und ein Zeichen 2 Bytes in dem .NET-Framework? Ein boolescher sollte 1Bit nehmen oder zumindest kleiner als ein Zeichen.

War es hilfreich?

Lösung

Es ist eine Frage der Speicherausrichtung. 4-Byte-Variablen schneller arbeiten als 2-Byte-Einsen. Dies ist der Grund, warum Sie int statt Byte oder kurz für Zähler und dergleichen verwendet werden soll.

Sie sollten nur 2-Byte-Variablen verwenden, wenn der Speicher eine größere Sorge als die Geschwindigkeit ist. Und das ist der Grund, warum char (die Unicode in .NET ist) zwei Bytes statt vier nimmt.

Andere Tipps

Über boolean

Die meisten anderen Antworten bekommen es falsch - Ausrichtung und Geschwindigkeit ist, warum ein Programmierer sollten Stick für Schleifenzähler auf int, nicht, warum der Compiler kann ein Byte 4 Byte breit sein lassen. Alle Ihre Argumentationen in der Tat gelten für Byte und kurze sowie boolean.

In C # zumindest Bool (oder System.Boolean) ist eine 1-Byte breite builtin Struktur, die automatisch verpackt werden kann, so dass Sie ein Objekt haben (die zwei Speicherworte muss zumindest vertreten zu lassen, dh 8/16 Bytes auf 32/64 bits Umgebungen bzw.) mit einem Feld (mindestens einem Byte) plus einem Speicherwort zu ihm, also insgesamt mindestens 13/25 Bytes zu zeigen.

Das ist in der Tat der erste Google-Eintrag auf „C # Urtyp“. http://msdn.microsoft.com/en-us/ Bibliothek / ms228360 (VS.80) aspx

Auch die zitierte Link ( http://geekswithblogs.net/cwilliams /archive/2005/09/18/54271.aspx ) heißt es auch, dass ein boolean, von dem CLI-Standard nimmt 1 Byte.

Tatsächlich ist jedoch der einzige Ort, an dem diese sichtbar ist, ist auf Anordnungen von booleans - n booleans würde n Bytes. In den anderen Fällen ein boolean dauern 4 Bytes.

  • Innerhalb einer Struktur, die meisten Laufzeiten (auch in Java), um alle Felder zu einer 4-Byte-Grenze für die Leistung ausrichten würden. Die Monty JVM für Embedded-Geräte ist weiser - Ich denke, es Felder optimal neu ordnet.
    • Auf dem lokalen Frame / Operanden-Stack für den Interpreter in den meisten Implementierung für Leistung, ein Stack-Eintrag ist ein Speicher-Wort breit (und vielleicht auf .NET muss es 64-Bit breit sein, doppelt und lange zu unterstützen, die auf .NET nutzt nur 1-Stack-Eintrag statt 2 in Java). Ein JIT-Compiler kann stattdessen 1 Byte für boolean Einheimischen während andere Vars durch Neuordnen Felder ohne Auswirkungen auf die Leistung ausgerichtet zu halten, wenn der zusätzliche Aufwand lohnt sich.

Über char

char sind zwei Bytes, weil, wenn die Unterstützung für die Internationalisierung erforderlich ist, unter Verwendung von Zwei-Byte-Zeichen intern die sicherste Wette ist. Dies ist nicht direkt an der Wahl zu unterstützen Unicode bezogen, sondern auf die Wahl in UTF-16 und auf die Basic Multilingual Plane zu halten. In Java und C # können Sie die ganze Zeit davon aus, dass eine logische char paßt in eine Variable vom Typ char.

Das ist, weil in einer 32-Bit-Umgebung kann die CPU 32-Bit-Werte verarbeitet schneller als 8-Bit- oder 16-Bit-Werte, so ist dies eine Geschwindigkeit / Größe Kompromiss. Wenn Sie Speicherplatz zu sparen und Sie haben eine große Menge an bools, benutzen Sie einfach uint s und Ihre booleans als die Bits 4 Byte speichern uint s. Chars sind 2 Bytes breit, da sie 16-Bit-Unicode-Zeichen speichern.

Unabhängig von dem kleinen Unterschied in Speicher, mit Booleschen für true / false ja / ist kein Wert wichtig für Entwickler (einschließlich dich selbst, wenn Sie den Code ein Jahr später nochmals zu besuchen haben), weil es genauer Ihre Absicht widerspiegelt. Ihr Code verständlicher zu machen ist viel wichtiger als die zwei Bytes zu speichern.

Machen Sie den Code genauer reflektieren Ihre Absicht auch die Wahrscheinlichkeit verringert, dass einige Compiler-Optimierung einen negativen Effekt haben wird. Dieser Rat transzendiert Plattformen und Compiler.

Sie sollten auch boolean verwenden, um maintanable Code zu schreiben. Wenn ich Code bin Blick zu sehen, dass etwas ein boolean dann mehr wert ist die Speichereinsparungen, um herauszufinden, dass Ihr mit char als booleans.

Das finde ich. „Eigentlich ein Boolean 4 Bytes ist, nicht 2. Der Grund dafür ist, dass das ist, was die CLR für Boolesche unterstützt Ich denke, das ist, was es tut, weil 32-Bit-Werte sind viel effizienter zu manipulieren, so dass die Zeit / Raum-Kompromiss ist in der Regel lohnt sich. Sie sollten die Bit-Vektor-Klasse verwenden (vergessen, wo es ist), wenn Sie zusammen ein paar Bits stauen müssen ... "

Es wird von Paul Wick geschrieben unter http://geekswithblogs.net /cwilliams/archive/2005/09/18/54271.aspx

Als erstes sollten Sie einen Profiler verwenden, um festzustellen, wo Sie ein Speicherproblem haben, IMHO.

Der Speicher ist nur ein Problem, wenn Sie eine große Palette von Bits haben, in dem Fall, dass Sie die System.Collections.BitArray Klasse verwenden können.

Sein, weil Windows und .Net verwendet haben Unicode (UTF-16) seit dem Anfang als ihren internen Zeichensatz. UTF 16 verwendet 2 Bytes pro Zeichen oder ein Paar von 2-Byte-Wörter pro Zeichen, sondern nur falls erforderlich, wie es ein Codierung variabler Breite ist.

"für Zeichen in der Basic Multilingual Plane (BMP) die resultierende Codierung ist ein einzelne 16-Bit-Wort. Für Zeichen in den anderen Ebenen, die Codierung in einem Paar von 16-Bit-Worten führt"

Meine Vermutung in Bezug auf booleans wäre sie vier Bytes sind als die Standard-Register 32 Bits ist und dies die Mindestgröße wäre .Net auf effizient eine logische Operation tun könnte, es sei denn, bitweise Operationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top