Es ist leicht zu sehen, dass:Logische Operationen auf Multiple-Modulus-Operationen optimiert?
(i % 3 == 0) && (i % 5 == 0)
vereinfacht werden kann:
(i % 15 == 0)
Doch in den Ausgang des GCC suchen, so scheint es, dies nicht auch bei hohen Optimierungsstufen durchgeführt wird.
Tun Compiler diese Art von Optimierungen, oder gibt es einen guten Grund, warum diese beiden Tests nicht semantisch gleichwertig sind?
Edit: Als Antwort auf diejenigen, die sagen, dass dies eine Rand Fall ist, wird die folgende ist ein ähnlicher Fall: dass
(i < 3) && (i < 5)
Eine beliebige Anzahl von weniger als 3, muss immer kleiner als 5. Zweiter Test überflüssig ist.
Ich würde auch die folgenden in Reaktion auf die Antwort hinzufügen, dass der Compiler nicht, wenn die Umgebung beeinflußt wird wissen können ... auf diesen Code ein:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
Ganze Funktion reduziert auf „repz ret "von GCC mit -O2
. Das ist viel komplexer als alles, worüber ich spreche.
meine Vermutung ist es, Kurzschlussauswertung zu garantieren ... – Anycorn
Prüfen Compiler im Allgemeinen für mehrere Vergleiche auf der gleichen Variable für die Optimierung? Es sieht aus wie ein Randfall ... – trutheality
@Anycorn, Willst du sagen, dass die Bewertung "i" kann Nebenwirkungen haben, und der Compiler nicht, ob es tut oder nicht? – ikegami