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. ]


Anmelden zum Antworten