![]() |
Speicherbedarf 9 Boolean Werte ist TBitset eine Alternative
Hi,
ich habe innerhalb einer Klasse 9 interne Boolean variablen, die 9 public properties darstellen. Da ich bei meinem Programm den Speicherbedarf sehr schmall und gering halten möchte, stellt sich mir gerade die Frage ob es mir was bringt anstatt der 9 Boolean Werte ein TBitset zu verwenden und bei den public properties dann jeweils über get Und Set Methoden auf das Bitset zuzugreifen ? Wenn ich mir jetzt aber die Klasse TBitset anschaue, sollte diese allein wegen dem Class overhead mehr Speicher in Anspruch nehmen, als 9 boolean variablen oder ? Hat jemand noch eine bessere Idee ? Danke und Gruß Data |
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Klar hab ich ne bessere Idee :)
Bau die TBitSet lokal nach:
Delphi-Quellcode:
type
TFoo = class private fBoolFlags: Cardinal; public: property Bool1: Boolean read fBoolFlags and 1 = 1 write fBoolFlags := fBoolFlags or 1 shl 1; property Bool2: Boolean read fBoolFlags and 2 = 2 write fBoolFlags := fBoolFlags or 1 shl 2; ... end; |
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Hallo Data,
wenn die Flags logisch zusammengehören, könntest du sie in einem Set zusammenfassen (wie TBorderIcons bei TForm). Gruß Hawkeye |
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Hi,
beide genannten Lösungen gefallen mir gut und wären bei meiner Klasse auch anwendbar. Die entscheidene Frage ist, was verbraucht weniger Speicher ? Mittlerweile sind es auch 13 Boolean Werte. Danke und Gruß Data |
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Letzlich wird beides auf logische Bitoperationen zurückgeführt, deshalb dürfte der Speicherverbrauch identisch sein. Die Lösung mit Sets bietet sich an, wenn die Flags zusammengehören. Bei der Lösung von Dax ist das Setzen/Lesen der Flags etwas einfacher, der von ihm angegebene Code dürfte aber vom Compiler nicht akzeptiert werden.
Hier eine Korrektur:
Delphi-Quellcode:
Gruß Hawkeye
type
TFoo = class private FBoolFlags: Cardinal; function GetFlags (aIndex: Integer): Boolean; procedure SetFlags (aIndex: Integer; aValue: Boolean); public property Bool1: Boolean index 0 read GetFlags write SetFlags; property Bool2: Boolean index 1 read GetFlags write SetFlags; end; function TFoo.GetFlags (aIndex: Integer): Boolean; begin Result := Odd(FBoolFlags shr aIndex); end; procedure TFoo.SetFlags (aIndex: Integer; aValue: Boolean); begin if aValue then FBoolFlags := FBoolFlags or (1 shl aIndex) else FBoolFlags := FBoolFlags and (not (1 shl aIndex)); end; |
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Zitat:
|
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Nur Delphi kennt dat leider nicht -.-''
Aber naja, aus 13 Byte (Boolean) 2 Byte gemacht ist schon 'ne große Reduzierung, auch wenn 11 Byte eigentlich noch garnicht soooo viel sind ^^ Beo BOLL(LongBool) wären das ja gleich 13*4=52 Byte gewäsen :roll: Auch wenn die Angaben nur auf die verwendeten Bytes gerechnet sind ... was die Speicherausrichtung noch mehr verbraucht hätte, sollte lieber mal nicht betrachtet werden ^^ |
Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
Ok, ich danke euch allen,
Gruß Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz