Einzelnen Beitrag anzeigen

SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#8

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 01:38
Zitat von Oxmyx:
Einfach gesagt: 32 Bit große Typen werden von der CPU schneller verarbeitet.

Aus genau diesem Grund richtet Delphi die Strukturmitglieder standardmäßig auch auf 4 Byte aus:
Delphi-Quellcode:
  TTest = record
    a: Byte;
    b: Integer;
  end;
belegt standardmäßig nicht etwa 5 Byte, wie man vermuten würde, sondern 8 Byte, weil das einzelne Byte auf 32 Bit ausgerichtet wird.
Das stimmt so nicht ganz. Nicht das Byte "a" wird ausgerichtet, sondern der Integer "b". Delphi richtet die Felder eines nicht-gepackten Records so aus, dass ein Feld der Größe X Bytes an einer Speicheradresse beginnt, die ohne Rest durch X teilbar ist (für X = 1, 2, 4, 8 ). Wandeln wir mal dein Beispiel etwas ab:
Delphi-Quellcode:
  TTest = record
    a: Byte;
    b: Int64;
  end;
Delphi fügt jetzt nicht 3 Bytes sondern 7 Bytes hinter "a" ein, damit "b", welches 8 Bytes groß ist, an einer Speicheradresse beginnt, die durch 8 teilbar ist. SizeOf(TTest) wäre somit nicht mehr 8 sondern 16.




Zitat von Eichhoernchen:
Hmm und das mit den größeren scheint dann ja nur "geschwindigkeits"vorteile zu bringen?!

Aber wird der Delphi kompiler nicht ehh dann aus jedem 1 byte bool nen 4 byte(32bit) bool machen, wenn die CPU das besser verarbeiten kann? wie schaut es bei 64 bit prozessoren aus? oder hat das jetzt gar nix damit zu tun? Ich kenne mich in dem Bereich nicht so gut aus. wäre da nen 8byte bool besser als nen 4er?
Im Falle der Ausrichtung wie oben erwähnt, ja. Wenn eine Variable, die mehrere Bytes groß ist, nicht richtig ausgerichtet ist (z.B. ein 16 Bit Word, das an einer ungeraden Speicheradresse beginnt), muss die CPU unter Umständen zwei Speicherzugriffe tätigen, um die Variable einmal zu lesen. Das sollte natürlich vermieden werden.

Was die Größe der Bools betrifft: meines Wissens stimmt es schon, dass Datentypen in der "nativen" Größe einer CPU vorzuziehen sind (wenn man nicht gerade Speicher sparen muss). Eine 8-Byte-Bool Variable könnte also durchaus die beste Wahl auf einer 64 Bit CPU sein. Aber ob z.B. ein LongBool nun in der Praxis (auf einem 32 Bit Prozessor) wirklich schneller ist als ein 8 Bit Boolean, weiß ich nicht (ich zweifle). Sollte jemand mal genau messen.

Zitat:
Die hab ja einen an der Waffel bei Borland 4 byte Bools, wo kommen wir noch hin....
Wie himitsu bereits schrieb, das ist nicht auf Borlands Mist gewachsen.




Zitat von himitsu:
Die Booleans sind ja so definiert:
Code:
True:  B <> 0
False: B = 0
Und die Standard-Konstanten:
Code:
True = 1
False = 0
in Delphi: Boolean = ByteBool
Ich glaube das stimmt nicht ganz. True = 1 gilt nur für Boolean. Für Byte/Word/LongBool ist True = -1. Es gibt also einen feinen Unterschied zwischen Boolean und ByteBool.
Zum Testen:
Delphi-Quellcode:
procedure BoolTest;
var
  B0: Boolean;
  B1: ByteBool;
  B2: WordBool;
  B3: LongBool;
begin
  B0 := True;
  B1 := True;
  B2 := True;
  B3 := True;
  ShowMessage(Format('B0 = %d'#10'B1 = %d'#10'B2 = %d'#10'B3 = %d',
    [Ord(B0), Ord(B1), Ord(B2), Ord(B3)]));
end;
  Mit Zitat antworten Zitat