Ich habe diesen Codeschnipsel:
%Vor% Nach dem Kompilieren mit deaktivierten Optimierungen ( $ gcc -Wall -Wextra -O0 main.c
) kompiliert der Code, und ich bekomme die folgende Ausgabe:
u = 22, l[u] = 0, t = 11, u_lu[u] = 21
Wenn ich mit vollständigen Optimierungen kompiliere ( $ gcc -Wall -Wextra -O3 main.c
), hängt das Programm, und oben zeigt an, dass es 100% meiner CPU verwendet. Es muss für immer in der do while-Schleife laufen.
Ich kann den Code mit vollständigen Optimierungen kompilieren und korrekt ausführen, indem ich einen oder alle der folgenden Punkte ändere:
1) Wenn ich l[0] = 0; l[1] = 0;
auskommentiere.
2) Wenn ich stattdessen u
a volatile int
mache.
3) Wenn ich die printf
innerhalb der do while-Schleife auskommentiere.
So verstehe ich natürlich nicht, was die Optimierungen machen und warum sie das Verhalten meines Programms verändern. Ich könnte einfach eine der obigen Lösungen wählen, um es zum Laufen zu bringen, aber ich möchte wirklich wissen, was hier vor sich geht. Es ist so komisch für mich.
(Das C ++ - Tag ist möglicherweise nicht geeignet, aber ich sehe das gleiche Verhalten auch mit g ++)
Wie in den Kommentaren erwähnt, könnte dies passieren, wenn Sie undefiniertes Verhalten aufrufen.
In Ihrem Fall ist dies der relevante Teil:
%Vor% Die Schleife läuft, während u
kleiner als 22 ist, also kann sie 21 werden. Aber innerhalb der Schleife erhöhen Sie u
zweimal und schreiben in u_lu[23]
. Dies ist eine mehr als zugewiesen.
Tags und Links optimization c c++ gcc