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 trueWarum 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
-
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ürKlasse<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.