Dies ist eine allgemeine Frage, aber da ich mich hauptsächlich mit gcc/g ++/VStudio beschäftige, habe ich es als c/C++ markiert. Die Frage kam mir in den Sinn, als ich mich mit Optimierungsmöglichkeiten herumärbte. Betrachten Sie in der einfachsten Form eine arithmetische Operation wie i/6 * 8
. Wenn ein Mensch diesem Ausdruck gegenübersteht, wird er ihn wahrscheinlich zu etwas wie vereinfachen. Und wenn er sich mit der Multiplikation mit 4 wohler fühlt, wird er das zuerst tun, d.h. (i * 4)/3
. Ich muss noch einmal betonen, dass dies nur ein einfaches Beispiel ist.Gibt es einen Fall, bei dem eine arithmetische Operation durch die Compileroptimierung beeinflusst wird?
Nun, was ist mit den Compilern? Gibt es Möglichkeiten, dass sie bei solchen Operationen dasselbe tun? Und da wir wissen, dass im obigen Beispiel i
eine Ganzzahl ist, kann die Vereinfachung und Änderung der Reihenfolge der Operationen zu völlig anderen Ergebnissen führen. Die Frage kann wie folgt geändert werden: Vermeiden die Compiler solche Aktionen vollständig?
Wenn wir möchten, dass das Programm einige arithmetische Operationen genau so ausführt, wie wir es angegeben haben, und ohne die Reihenfolge der Operationen zu ändern, sollten wir uns über das Verhalten des Compilers Sorgen machen?
Ein optimierender Compiler ändert den angegebenen Code in den schnellsten Code, den er kennt, der die Garantien der Sprache beibehält. – xaxxon
Mit anderen Worten, "sollten wir uns Sorgen um das Verhalten des Compilers machen?" Nein, * wenn * Sie gültigen Code schreiben. UB-Code in eine andere Sache zu transformieren ist absolut gültig und passiert in der Realität. – deviantfan
Ich weiß. Aber ich will sicher sein. Der Titel der Frage fragt, ob sich jemand mit solchen Vorfällen konfrontiert sieht. –