Performance von bools / Operationen auf bools



  • Hallo zusammen,

    Ich arbeite unter VS2005 (also sizeof(bool) = 1) und ich wollte wissen, wie die Performance von bools ist. Wird ein bool denn bei der Kompilierung automatisch in ein Integer verwandelt oder passiert zur Laufzeit eine Konvertierung?
    Ist eine boolsche Operation wie

    bool x = a || (b && c) || (d && e)
    

    (angenommen a,b,c,d,e sind auch bools)
    von der Performance her ähnlich wie

    char x = a + (b * c) + (d * e)
    

    (angenommen a,b,c,d,e sind signed chars) und dann einfach überprüfen ob x > 0 für true?

    Wäre es besser das ganze in ein 32 Bit int zu packen (32 Bit Architektur angenommen)

    Oder soll man lieber die Finger von solchen Optimierungen lassen und die Aufgabe dem Compiler überlassen weil er das sowieso viel besser kann?



  • pub00515 schrieb:

    Oder soll man lieber die Finger von solchen Optimierungen lassen und die Aufgabe dem Compiler überlassen weil er das sowieso viel besser kann?

    Definitiv.
    Lass den Code mal schön so, dass er eine ordentliche Aussagekraft hat.



  • Wird ein bool denn bei der Kompilierung automatisch in ein Integer verwandelt oder passiert zur Laufzeit eine Konvertierung?

    wozu denn überhaupt irgendwelche konvertierungen? ich dachte, 1 bool würde genau in ein halbes register passen? oder ist es mittlerweile so, dass weder prozessoren noch RAM mit einzelnen bytes arbeiten? 😕



  • @pub00515: überlass es dem Compiler, und verwende die Typen die "logisch" sind. Konvertiert wird (wenn nötig) bei der Zuweisung int -> bool, da der Compiler sonst oft nicht sicherstellen kann dass das bool entweder 1 oder 0 ist aber sonst nix. z.B. folgender Code wird konvertieren müssen:

    int foo(int x)
    {
        bool b = x;
        return b; // wieder nach int
    }
    

    Das Ergebnis von "foo" darf auch nach der Rückwandlung nach "int" nur 1 oder 0 sein, daher müssen alle Werte ausser 0 auf 1 abgebildet werden.

    @Andrey: wie ein bool intern abgebildet wird ist AFAIK nicht spezifiziert (kann also der Compiler machen wie er mag). Oft wird ein Byte verwendet, manche Compiler machen aber auch einfach nen int draus.


Anmelden zum Antworten