Variable wird auf booleschen Wert ('True' oder 'False') gesetzt ...
-
Hi,
wie treib ich meinem Compiler (VC 6.0) diese nervige Warnung aus, ohne sie zz deaktivieren (bzw. mach ich hier was "Schlimmes"?):
typedef unsigned int StreamFlags; #define SF_MAYREAD 0x0000000F #define SF_MAYWRITE 0x000000F0 #define SF_OVERWRITE 0x00000F00 #define SF_BINARY 0x0000F000 bool DataStream::GetMayRead(void) const { return (bool)(m_StreamFlags & SF_MAYREAD); } bool DataStream::GetMayWrite(void) const { return static_cast<bool>(m_StreamFlags & SF_MAYWRITE); } bool DataStream::GetOverwrite(void) const { return m_StreamFlags & SF_OVERWRITE; } bool DataStream::IsBinary(void) const { return m_StreamFlags & SF_BINARY; }
Wie man sieht, hab ich es schon mit einem C-Cast und einem static_cast probiert, aber ich krieg die Warnung immer noch
ChrisM
-
return !!m_StreamFlags & SF_BINARY;
-
Warnung ist immer doch da. Hätt mich auch schwer gewundert, wenn die nach doppelter Negation plötzlich weg wär (von dem Overhead mal ganz zu schweigen)
ChrisM
PS: Volkard schreibt man die d!
-
ne das wär falsch: Da fehlen Klammern.
-
Stimmt, mit Klammern gehts!
Ist das jetzt ein Witz mit der doppelten Negation oder soll ich das wirklich so machen?Sieht nämlich reichlich dämlich aus und geht bestimmt auf die Performance!
ChrisM
-
ich bin doch nicht der volkart mit D :o :p
also mit visual c++ 7 ist dann die warnung weg.
ok, wegen der klammern werd ich mir mal angucken. danke bashar.
-
Original erstellt von ChrisM:
**(von dem Overhead mal ganz zu schweigen)
**dir ist doch klar der der compilier das sicherlich wegoptimiert?
lösung:
bool DataStream::IsBinary(void) const { return (m_StreamFlags & SF_BINARY) != 0; }
-
Ja, mit VC6 ist sie dann auch weg, aber irgendwie sieht das komisch aus und geht bestimmt auf die Performance.
ChrisM
-
ist dein cast auf bool nicht n bisschen sinnlos? weis nicht genau wie bool in bitfolge aussieht, könnte mir aber folgendes vorstellen:
false: 00000000
true: 00000001
demnach kommt doch bei deinen castst immer true raus oder?
-
Naja, ich will halt das alles != 0 true wird und der Rest false, bei möglichst guter Performance!
ChrisM
-
Merke: Warnungen sind da um ignoriert zu werden.
-
ChrisM: Dann folge Dimah's Vorschlag. Wie stellst du dir intern die Umwandlung eines int (Ergebnis von &) in ein bool vor? Ein cast nach bool müßte prüfen, ob der int == 0 ist, und ihn dann zurückgeben; andernfalls vorher auf 1 setzen.
;; folgender Code ist Spekulation :) ;; int steht in eax orl %eax,%eax jz ende movl $1,%eax ende: ret ;; Rückgabewert implizit in eax
Sieht irgendwie genauso aus wie der Code für einen expliziten Vergleich mit 0.
!!x ist ein verbreitetes Idiom zur Umwandlung beliebiger Werte in Pseudo-bool (als int) in C, so dass vermutlich viele Compiler den Sinn dahinter "verstehen" und auch optimalen Code generieren können.
-
Original erstellt von ChrisM:
Naja, ich will halt das alles != 0 true wird und der Rest false, bei möglichst guter Performance!ist das ein flaschenhals bei dir?
weder ein & noch ein != noch ein ! brauchen massiv zeit.
kann es sein, dass du versuchst zu 'über optimieren'?
schau dir mal die 20/80 Regel an.PS:
Dimahs Code produziert wahrscheinlich exakt den selben assembler code wie deiner.
-
OK, ich verwende die Lösung von Dimah.
Normalerweise will ich gar nicht so sehr optimieren, aber da ist es wichtig, weil diese Funktion immer aufgerufen wird, wenn etwas gelesen/geschrieben wird und wenn jetzt z.B. eine 1MB-Textur byteweise ausgelesen wird, soll das auch akzeptabel schnell gehen.
ChrisM
-
Wie oft fragst du denn bei einer 1MB-Datei ab, ob sie zum lesen oder schreiben geöffnet ist?
-
Warum machst du es überhaupt mit einer Bitmaske? Nimm doch 4 bool variablen
-
*vordenganzengurusimraumniederknieundlobpreisungensing*
Ich hab ja nicht viel Ahnung, aber wie wäre es denn damit?return m_StreamFlags & SF_BINARY & 1;
-
das wär Unsinn. Es ist identisch mit dem vorherigen, falls SF_BINARY == 1, sonst konstant 0.
-
Es ist identisch mit dem vorherigen
Heisst das jetzt, dass es funktioniert oder nicht?
falls SF_BINARY == 1, sonst konstant 0.
Das ist doch der Sinn der Sache, oder?
-
OK nochmal langsam:
Falls SF_BINARY == 1, dann ist
return m_StreamFlags & SF_BINARY & 1; identisch mit return m_StreamFlags & SF_BINARY;
Falls SF_BINARY != 1, dann ist
return m_StreamFlags & SF_BINARY & 1; identisch mit return 0; (ausgehend davon, dass SF_BINARY ein 1-Bit-Flag ist)
Wo genau ist jetzt deine Verbesserung?
[ Dieser Beitrag wurde am 25.04.2003 um 15:13 Uhr von Bashar editiert. ]