Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherbedarf 9 Boolean Werte ist TBitset eine Alternative (https://www.delphipraxis.net/70178-speicherbedarf-9-boolean-werte-ist-tbitset-eine-alternative.html)

DataCool 26. Mai 2006 11:53


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

Dax 26. Mai 2006 12:03

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;

Hawkeye219 26. Mai 2006 12:04

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

DataCool 26. Mai 2006 12:12

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

Hawkeye219 26. Mai 2006 12:48

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:
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;
Gruß Hawkeye

Dax 26. Mai 2006 12:51

Re: Speicherbedarf 9 Boolean Werte ist TBitset eine Alternat
 
Zitat:

Zitat von Hawkeye219
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.

No wonder :oops: Das ist Chrome-Code, und Chrome kennt nun mal implizite Getter/Setter ;)

himitsu 26. Mai 2006 13:34

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 ^^

DataCool 26. Mai 2006 13:42

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