Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Boolsche Datentypen, die mehr als 1 Byte belegen

  Alt 13. Jan 2006, 09:02
Zitat von Matze:
@Mystic: Achso, das hat Performancegründe, aber ganz klar ist es mir trptzdem nicht. Wieso ist das schneller, als beim normalen Boolean?
Auch wenn die Frage nicht an mich gerichtet ist beantworte ich die einfach mal. Der einfache Grund ist die Registerbreite deines Prozessors. Heutige Prozessoren sind in der Regel 32 Bitig, das heißt nichts anderes, als dass deine Register 4 Byte breit sind. Selbst bei den 64 Bitern wird häufig ein 32 Bit BS verwendet, läuft also letztlich auf's selbe hinaus.
Schnelleren Speicher als diese Register wirst du nirgends im Rechner finden, Operationen auf ihnen laufen mit vollem Systemtakt. Ein solches Register wird auch nicht in Einzelteilen betrachtet (die Möglichkeit gäbe es, aber eben nicht für alle Register). Deshalb musst du alle Werte die nur 1 oder 2 Byte belegen in so einem Register mit 0en auffüllen. Willst du prüfen ob ein Wert ungleich 0 ist, und du hast 100000000, dann wäre das als Byte zwar eine 0, aber die oberste 1 könnte noch in dem Register stehen und der Vergleich (32 Bit) würde sagen es ist ungleich 0. Dieses Auffüllen mit 0en ist also ein Schritt mehr (pro Zugriff), den du machen musst. Dies entfällt bei einem Longbool ganz einfach. Du wirst es häufiger in C/C++ Bibliotheken finden, dass deswegen Datentypen DoubleWord orientiert angelegt werden, halt auch das Bool (in C gilt soweit ich weiß <> 0 -> True, 0 False).

Das ist auch schon alles. Natürlich kann man sich darüber streiten ab wann es Sinn macht, denn bei den meisten Programmen wird die IDLE-Zeit und der Zugriff auf langsameren Speicher eine Boolean vs. LongBool Variable übersteigen, aber genauso könnte man fragen ob 3 gesparte Byte das wirklich Wert sind.
An sich wird natürlich in der heutigen Zeit (riesiger Speicher, hohe Abstraktionsebene) viel mehr Wert auf Performance gelegt als auf Speicherverbrauch (nicht überall, ist klar). Wenn du schon dabei bist, schau einfach mal bei Integer und Cardinal vorbei, die gibt es auch nicht nur so. Selber Grund, die sind immer optimal was die Performance angeht, denn sie entsprechen immer der Registerbreite (bzw. dem BS). Nur wenn du ein festgelegtes Protokoll hast, eine Bibliothek oder ähnliches, wo du weißt wie viel Byte ein Wert exakt belegt, verwendest du dann LongWord statt Cardinal (analog für alle anderen).

Gruß Der Unwissende
  Mit Zitat antworten Zitat