Übersetzungsunterschied
-
Macht der Compiler einen Unterschied zwischen
int a = 0; while(a++ < 10);und
int a = 0; while(a++ != 10);beim Übersetzen in Assembler-Code?
(Ersteres trägt zur Verständlichkeit bei...)
-
Im allgemeinen ja. Ein Test auf Ungleichheit oder Kleiner ist recht unterschiedlich.
Kann aber sein, dass im richtigen Kontext beides zum gleichen wird, aber das müsstest du halt mal schauen.
-
Wobei Ungleichheit schneller geprüft ist, denn dabei muss nur der Speicher verglichen werden ohne die Wertsemantik verstehen zu müssen. Kann der Compiler das denn nicht optimieren, sodass der Code übersichtlich(er) ist? C++-Compiler sind ja eh Multi-Pass also ist es kein allzu grosser Schritt mehr...
-
EOutOfResources schrieb:
Wobei Ungleichheit schneller geprüft ist
Bei einem "int" ist das vollkommen egal, vorausgesetzt die Ziel-CPU unterstützt den Typ "native" (was meist der Fall ist).
Kann der Compiler das denn nicht optimieren, sodass der Code übersichtlich(er) ist? C++-Compiler sind ja eh Multi-Pass also ist es kein allzu grosser Schritt mehr...
Der Compiler kann einiges optimieren. Er kann u.U. sogar die ganze Schleife wegoptimieren, und die Variable "a" gleich mit. Der ganze Code wird zu "nichts".
Bzw. falls "a" später noch verwendet wird, kann er immer noch die Schleife wegoptimieren, und einfach "int a = 10" draus machen.
-
Ich verstehe nicht ganz worauf du hinaus willst. Warum sollte ein Compiler etwas übersichtlicher machen?!
Im allgemeinen darf der Compiler die beiden Anweisungen gar nicht gleich machen. Gewisse Nebeneffekte müssen immer miteinbezogen werden.MSVC++2010 macht das hier (optimiert):
while(a++ < 10); 01291007 inc ecx 01291008 dec eax 01291009 jne main+7 (1291007h) int b = 0; while(b++ != 10); std::cout << a << " " << b; 0129100B push 0Bh 0129100D push ecxDa siehst du, dass das erste noch explizit ausgeführt wird, während das zweite bereits berechnet wurde. Warum hier die erste Version nicht auch weiter wegoptimiert wurde kann ich nicht genau sagen, aber es werden wohl Nebeneffekte miteinbezogen, welche bei der zweiten Variante nicht passieren können.
btw:
C++ Compiler sind eben nicht Multipass. Darum brauchst ja auch immer brav die Deklarationen von Funktionen, wenn du eine verwenden willst bevor sie definiert wurde.