___ answer10300269 ___
Sie sind dem Compiler ausgeliefert. In der Tat, wenn es schlau ist, wird es erkennen, dass es ein Noop ist. Übrigens hat Neil Butterworth einen netten Post, wo er auch anklickt dieses Thema.
___ antwort10300566 ___
Es ist etwas schrecklich nicht tragbar.
In einigen Compilern kann einer von diesen funktionieren (aber Sie müssen überprüfen, ob die volle Optimierung aktiviert ist, die leere Anweisung wird möglicherweise verworfen):
%Vor%
oder:
%Vor%
Wenn Sie Glück haben, dann kann Ihr Compiler ein Makro oder eine intrinsische Funktion bereitstellen, die zur Assembleranweisung volatile
kompiliert wird, etwas wie avr-gcc
in MSVC.
Als letzte Ressource können Sie einfach eine einzelne Assembly-Anweisung (es ist Compiler-abhängig, es kann __asm oder etwas ähnliches sein) ausführen ... nichts, wie folgt:
%Vor%
oder (überprüfen Sie Ihre Compiler-Dokumentation):
%Vor%
BEARBEITEN
Wenn Sie keine Anweisung util/delay.h
haben und keinen Assembler-Code hinzufügen können (es tut mir leid, welche Art von Compiler Sie verwenden?), Können Sie sich darauf verlassen, dass eine Anweisung mit einem Nebeneffekt dies nicht tut weg optimiert werden (oder, wie von @ouah gepostet, ein Zugriff auf eine Variable, die als %code% deklariert wurde).
___ antwort10300748 ___
Die Antwort ist ja, der Compiler kann die Schleife optimieren.
Verwenden Sie das Qualifikationsmerkmal %code% , um die Optimierung zu vermeiden:
%Vor%
Wenn Sie in der eingebetteten Welt programmieren, lesen Sie die Dokumentation Ihres Compilers, da sie normalerweise Verzögerungsfunktionen bereitstellen, die auf eine bestimmte Anzahl von Zyklen oder Mikrosekunden warten, die im Parameter übergeben wurden.
Zum Beispiel hat %code% die folgende Funktion in %code% :
%Vor%
___ qstntxt ___
Ich schaue mir einen Code an, der überprüft werden muss, und bin auf ein hektisches Warten gestoßen:
%Vor%
Ich erinnere mich zu lesen, dass diese leeren Schleifen weg optimiert werden können. Würde das hier geschehen oder könnte das funktionieren?
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt.
___ answer10300371 ___
Einige Compiler, wie gcc, werden feststellen, dass es eine leere for-Schleife ist und pessimize dafür, mit der Erwartung, dass Sie es als eine Delay-Schleife einfügen. Sie können mehr darüber in Ссылка
lesen
Beachten Sie, dass dies compilerspezifisch ist, also zählen Sie nicht mit allen Compilern darauf.
___ qstnhdr ___ Wird eine leere for-Schleife, die als Schlaf verwendet wird, weg optimiert?
___ answer31072269 ___
Nichts im Sprachstandard verbietet es, also können Compiler es tun, wenn sie dazu in der Lage sind.
Lassen Sie uns GCC 4.8 dekompilieren, um zu sehen, was es macht
Eingabecode:
%Vor%
Kompilieren und dekompilieren:
%Vor%
Ausgabe:
%Vor%
Die Schleife ist da: Das %code% springt zurück.
Mit %code% :
%Vor%
was nur 0 zurückgibt. Also wurde es komplett weg optimiert.
Dieselbe Analyse kann für jeden Compiler durchgeführt werden.
Siehe auch
___