Ü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        ecx
    

    Da 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.


Anmelden zum Antworten