Frage zur Optimierfähigkeit meines Compilers



  • Hallo, folgenden Code habe ich im Release Modus compiliert:

    template<unsigned int N> class Klasse
    {
        void foo(unsigned int a) const
        {
            if(N<32)
            {
                if(a >= (1<<N) )
                    cout<<"error";
            }
        }
    };
    
    //...
    
    Klasse<34> test;
    

    Dann bekomme ich als Warnung:

    [Zeile 7] left shift count >= width of type [with N=34]
    

    Aber diese If Abfrage kann der Compiler doch nie Erreichen, da N<32 immer false ist.
    Er scheint allerdings den Shift an sich zu optimieren, indem er den Ausdruck mit einer Null ersetzt

    [Zeile 7] comparison of unsigned expression >= 0 is always true
    

    Warum optimiert mein Compiler (Code Blocks) nicht die ganze If Abfrage raus? Oder hat die Warnung des Compilers nichts mit dem eigentlichen Binary nachher zu tun?



  • Oder hat die Warnung des Compilers nichts mit dem eigentlichen Binary nachher zu tun?

    genau

    kannst ja mal die disassembly angucken ob er dafür wirklich code generiert hat
    sollte er nicht
    wenn schon is GCC schlechter als ich dachte


  • Mod

    Die Optimierung findet normalerweise nach dem Compilieren statt, daher wird der Code vorher schon durchgecheckt. Was ja auch sehr sinnvoll ist, denn in 99% der Fälle ist sowas wie dein Beispiel ja ein Programmierfehler und sollte mit einer entsprechenden Warnung bedacht werden.



  • Dass die Warnung überhaupt ausgegeben wird, sollte ein Zeichen dafür sein, dass der Compiler gemerkt hat, welche Umstände vorliegen und demnach den Ausdruck optimieren wird.
    Wenn du den Assembly-Output überprüfst, dann siehst du, dass z.B. für

    Klasse<34> test;
    test.foo(100);
    

    keinerlei Code erzeugt wird.

    Übrigens: den Compiler, den du verwendest, ist gcc bzw. g++. Code::Blocks ist "nur" eine IDE.


Anmelden zum Antworten