Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Union für mer Performance

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.09.2006, 16:29 Uhr
~Schnulla
Gast


Hallo Leute !

Ich habe folgende Idee und würde gerne mal wissen ob
das möglich und ok ist oder eher ein hack den man
nicht machen sollte.

Ich habe 4 bool variablen und möchte :
1. jede einzelne auf true/false testen können
2. mit nur einem "Zugriff" testen können ob alle false sind

Um das zu ermöglichen dachte ich mir verwende ich unio wie folgt :


C++:
struct BoolBundle
{
  bool A;
  bool B;
  bool C;
  bool D;
};
  
union {
  unsigned int ZeroIfAllFalse;
  BoolBundle   Boolean;
};


4x 1Byte große bool Variablen teilen sich also den gleichen Speicher mit
1x 4Byte großer unsigned int Variable. Sind alle A,B,C,D false, dann ist
auch ZeroIfAllFalse==0, richtig ?

Somit könnte ich ganz einfach mit
if (ZeroIfAllFalse==0) prüfen ob alle false sind.

Ich müßte blos prüfen ob unsigned int immer genauso groß ist
wie 4 bytes (was auf 32bit systemen ja der Fall ist).

Was haltet Ihr davon, ist es unsinnig sowas zu machen weil
es eher ein hack ist und vielleicht es doch irgendwie probleme
geben könnte oder könnte ich das einfach so machen wenn ich
vor dem Programmstart noch teste ob
sizeof(unsigned int) == 4*sizeof(byte) ist ?

Freu mich über Eure Meinungen, es müßte doch auf jedenfall schneller
sein als wenn ich statt (ZeroIfAllFalse==0) prüfen müßte ob
!(A || B || C || D) oder ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.09.2006, 16:36 Uhr
Tommix



Hallo,
bei solchen Optimierungen fragt sich immer, ob sie am Ende irgend einen spürbaren Gewinn bringen. Wie auch immer, müßtest Du testen: sizeof(unsigned) == 4*sizeof(bool) (wieso byte auf einmal?) und außerdem noch sizeof(struct BoolBundle) == sizeof(unsigned) (der Compiler kann die einzelnen bools durchaus auf Wortgrenzen legen und dann ist das struct gleich viermal so groß.

Gruß, Tommix


Bearbeitung:
typo

Dieser Post wurde am 06.09.2006 um 16:40 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.09.2006, 16:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


vor dem programmstart bringt nicht viel :P

sizeof wird bei kompilierzeit ausgewertet.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.09.2006, 16:45 Uhr
Blubber2063



Hmmm, naja das ist so nicht richtig, er muss eigentlich nur schaun das gilt sizeof(bool)*4 <= sizeof(unsigned). Denn für die Interpretation reicht es aus, wenn der Wert kleiner ist. Die Optimierung ist jedoch sehr spezifisch, ob der Nutzen allzu groß ist hängt wohl von der Anwendung ab, aber in aller Regel braucht man ja doch alle 4 Bool Werte, immerhin gibt das im anderen Fall eine Überprüfung mehr, nämlich die ob alle false sind, erst dann würde man die anderen Überprüfen, du gewinnst also nur Performance für denn Fall, dass alle false sind, ist das nicht der Fall verlängerst du die Laufzeit. In aller Regel gewinnt man Laufzeit meistens eh nur dadurch das man woanders Verluste an Speicher oder Laufzeit hinnimmt.(Es sei denn es war eh ineffektiv gelöst)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.09.2006, 17:42 Uhr
Tommix



@Flo
Die Kompilierzeit ist vor dem Programmstart
Zumindest gilt das Ergebnis auch zur Laufzeit noch und man könnte schon nicht funktionierende Platformen ausschließen. Ich halte das Ganze trotzdem für wenig sinnvoll.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.09.2006, 18:27 Uhr
(un)wissender
Niveauwart


Jupp ist wenig sinnvoll.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.09.2006, 08:45 Uhr
ao

(Operator)



Zitat von ~Schnulla:
4x 1Byte große bool Variablen teilen sich also den gleichen Speicher mit
1x 4Byte großer unsigned int Variable. Sind alle A,B,C,D false, dann ist
auch ZeroIfAllFalse==0, richtig ?

Vielleicht. Annahmen übers Speicherlayout zu treffen ist gefährlich. Das Ergebnis kann abhängig sein von Compiler-Einstellungen (z.B. Optimierungen), es kann sich von einer Compilerversion zur nächsten ändern und bei verschiedenen Compilern sowieso.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.09.2006, 09:33 Uhr
~Lars
Gast


Wozu das alles? Warum nicht nur ein unsigned int nehmen und vier beliebige Bits davon verwenden? Die Abfrage, ob eins davon gesetzt ist, ginge dann so:


Code:
unsigned int uintBoolSammel;
...
if (uintBoolSammel & 1) ... // niedrigstes Bit gesetzt
if (uintBoolSammel & 2) ... // zweitniedrigstes Bit gesetzt
if (uintBoolSammel & 4) ... // drittniedrigstes Bit gesetzt
usw.



Und die Abfrage, ob keins davon gesetzt ist, wie vorher mit if (!uintBoolSammel)

Bits setzen ist auch leicht. Für sowas nimmt man doch keine Unions! :-)

bye
Lars
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.09.2006, 10:03 Uhr
ao

(Operator)



Zitat von ~Lars:
Wozu das alles? Warum nicht nur ein unsigned int nehmen und vier beliebige Bits davon verwenden?

Weil problem-adäquate Datentypen wesentlich dazu beitragen, ein Programm lesbar und übersichtlich und damit pflegbar zu machen.

C++:
bool CheckA (); // Liefert bool-Ergebnis für A
bool A = CheckA ();
if (A || B)
{
    ...
}


ist nun mal übersichtlicher als so was hier:

C++:
unsigned flags = CheckA () ? flags | 4 : flags & ~4;
if (flags & (4 | 2))
{
    ...
}


ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: