Der Code Ich habe sieht wie folgt aus (alle Verwendungen gezeigt getan):Wird der Compiler das Entkommen einer inneren Schleife optimieren?
bool done = false;
for(int i = 0; i < big; i++)
{
...
for(int j = 0; j < wow; j++)
{
...
if(foo(i,j))
{
done = true;
break;
}
...
}
if(done) break;
...
}
werden alle Compiler wandelt es in diese:
for(int i = 0; i < big; i++)
{
...
for(int j = 0; j < wow; j++)
{
...
if(foo(i,j))
goto __done; // same as a labeled break if we had it
...
}
...
}
__done:;
Hinweis: Während ich bin meistens interessiert an Wenn die if(done)break;
wird umgangen und als toter Code entfernt, bin ich auch interessiert, wenn es und done
wird insgesamt entfernt.
Übrigens sollten Sie keine Symbole definieren, die mit zwei Unterstrichen beginnen; Solche Symbole sind reserviert. –
Das Symbol wäre das Ergebnis eines Optimierungsdurchlaufs, z. generiert vom Compiler. Ich habe diesen Namen benutzt, weil er einen reservierten/internen Namen anzeigt. – BCS
Und die Frage: Warum ist das nicht in einer Funktion versteckt?Sie könnten dann eine 'return' verwenden;) –