Fragen? Antworten! Siehe auch: Alternativlos
Aber manchmal stößt man auf Fälle, wo noch was geht. Ich hab hier einen gefunden:
int dummy1() { static int removeme = 0; if (removeme) { return 0; } removeme = 1; return 0; }Der Inhalt von removeme hat offensichtlich keine beobachtbaren Auswirkungen, kann also eigentlich komplett weg. Das machen aber weder gcc noch clang, beide mit -O3. Besonders krass: Selbst mit -flto nicht!
Zum Spielen habe ich das nochmal leicht umformuliert probiert:
int dummy2() { static int removeme = 0; if (!removeme) removeme = 1; return 0; } int dummy3() { static int removeme = 0; removeme = 1; return 0; }Bei dummy3 fällt gcc und clang auf, dass man removeme komplett wegmachen kann. Bei dummy2 aber auch nicht.
Ich bin gerade ein bisschen schockiert, dass selbst Link Time Optimization das nicht wegschmeißt. Hier der Testcode dafür:
int main() { return dummy1() + dummy2() + dummy3(); }Und da kommt dann dieser Code raus (amd64):
16d0: 80 3d 95 22 00 00 00 cmpb $0x0,0x2295(%rip) # 396c <dummy1.removeme> 16d7: 74 0c je 16e5 <main+0x15> 16d9: 80 3d 90 22 00 00 00 cmpb $0x0,0x2290(%rip) # 3970 <dummy2.removeme> 16e0: 74 13 je 16f5 <main+0x25> 16e2: 31 c0 xor %eax,%eax 16e4: c3 ret 16e5: c6 05 80 22 00 00 01 movb $0x1,0x2280(%rip) # 396c <dummy1.removeme> 16ec: 80 3d 7d 22 00 00 00 cmpb $0x0,0x227d(%rip) # 3970 <dummy2.removeme> 16f3: 75 ed jne 16e2 <main+0x12> 16f5: c6 05 74 22 00 00 01 movb $0x1,0x2274(%rip) # 3970 <dummy2.removeme> 16fc: 31 c0 xor %eax,%eax 16fe: c3 retVielleicht übersehe ich da gerade irgendeine Formulierung in irgendeinem Standard. Mal gucken, was die sagen. Habe Bugs eingetragen bei gcc und clang.