Der Code, den ich habe, sieht so aus (alle Verwendungen von done):
%Vor%wird jeder Compiler es zu diesem konvertieren:
%Vor% Hinweis: Während ich mich hauptsächlich dafür interessiere, dass if(done)break;
umgangen und als toter Code entfernt wird, interessiert mich auch, ob es und done
komplett entfernt werden.
Offensichtlich hängt das vom Compiler ab. Wenn Sie sich nicht sicher sind, sollten Sie am besten die Assembly-Ausgabe des Compilers anzeigen (alle gängigen Compiler haben dafür einen Schalter). Auch wenn Sie mit der Assembly nicht vertraut sind, können Sie die Debug-Version zumindest mit der optimierten Version vergleichen.
Dies gesagt, ist dies eine der wenigen Situationen, in denen goto
keine schlechte Idee ist . Fühlen Sie sich frei, es aus inneren Schleifen zu brechen.
Bearbeiten
Habe gerade in VS2010 Folgendes versucht und es optimiert tatsächlich die äußere Bedingung:
%Vor%GNU-Compiler macht genau das, beginnend mit der Optimierungsstufe -O1 (ich benutze gcc 4.5.1 auf x86_64)
%Vor%wobei .L14 die Beschriftung ist, die genau dort platziert wurde, wo Sie __done:
platziert habenEine bessere Frage könnte sein: welcher moderne Compiler führt diese Optimierung nicht durch?
Ich versuche nicht, snarky zu sein, aber ... ist es wichtig? Im Allgemeinen denke ich, dass es am besten ist, Compiler zu ihrem Job zu lassen, und dieser Job besteht darin, den "besten" (kompilierten) Code, der Ihrem Quellcode entspricht, zu erstellen (beachten Sie, dass "am besten" je nach Ihren Bedürfnissen variieren kann). Alle Leistungsaspekte in Ihrem Code sollten mit einem Profiler und guten Arbeitskenntnissen in Bezug auf algorithmische Komplexität identifiziert werden.
Wenn Sie nur neugierig sind, ignorieren Sie diesen Kommentar. Aber wenn Sie Ihren Code irgendwie optimieren möchten, dann gibt es meiner Meinung nach viel bessere Möglichkeiten.
Tags und Links optimization c++ compiler-construction