[solved] Werden Klammern berücksichtigt oder wegoptimiert?




  • Administrator

    Ok, ich habe es hier gerade auch gefunden:
    http://www.cplusplus.com/doc/tutorial/operators.html

    Es sind zwar keine offiziellen Dokumente, aber was solls. Ich muss mich wohl darauf verlassen und werde zur Sicherheit auch noch ein paar Tests durchführen um gaaaaaaaaaannnnz sicher zu gehen 🙂

    Ich hoffe die Compiler halten sich in dem Punkt explizit an den Standard. 🙂

    Grüssli und Danke!



  • Der Standard schreibt eine Präzedenz der Operatoren nicht explizit vor, sondern sagt nur, dass diese aus der Syntax-Definition folgt. Das heißt auch ziemlich direkt, dass deine Klammerung immer berücksichtigt wird.



  • Wenn du konkret was zu dem Thema wissen willst kannst du da nachgucken: http://msdn.microsoft.com/en-us/library/aa289157(vs.71).aspx

    Kurz: MSVC macht so ziemlich was er will, solange man es ihm nicht mit entsprechenden Switches verbietet, was netterweise auch möglich ist.



  • Wer ja auch schlimm, wenn man sich nicht mla auf die Klammersetzung verlassen könnte.


  • Administrator

    hustbaer schrieb:

    Wenn du konkret was zu dem Thema wissen willst kannst du da nachgucken: http://msdn.microsoft.com/en-us/library/aa289157(vs.71).aspx

    Kurz: MSVC macht so ziemlich was er will, solange man es ihm nicht mit entsprechenden Switches verbietet, was netterweise auch möglich ist.

    Da geht es aber um Floating-Point Optimization. Ich persönlich brauche in dem Fall allerdings integrale Typen. Gibt es dazu auch einen Artikel? 🙂

    Aber ganz interessant und gut zu wissen, merk ich mir, wenn ich das nächste Mal mit floats und doubles arbeite. Danke!

    Grüssli


  • Mod

    Dravere schrieb:

    (VarA * VarB) / VarC;
    

    Der Standard schreibt hier ein ganz bestimmtes Verhalten vor, d.h. einen bestimmten Wert für den Ausdruck, für gegebene VarA,VarB,VarC sofern die besonderen Werte nicht zu undefiniertem Verhalten (wegen Überlauf oder Division durch 0) führen. Er schreibt (im Wesentlichen) nicht vor, wie eine Implementation zu diesem Wert kommen kann. Falls Var*(VarB/VarC) zum gleichen Ergebnis kommen sollte (tut es nicht), wäre es eine zulässige Transformation. Es gibt ein etwas interessanteres Beispiel direkt im Standard (1.9/15):

    int a, b;
    /*...*/
    a = a + 32760 + b + 5;
    

    Eine Implementation darf dies im Allgemeinen nicht umschreiben als

    a = ((a + 32765) + b); // oder
    a = (a + (b + 32765));
    

    Da beide Ausdrücke für bestimmte Werte (z.B. a = –32754, b = –15 und 16-bit Integer) zu Überläufen führen würden, während der originale Ausdruck das nicht tut (für diese Werte). Etwas anderes gilt dagegen, falls diese spezielle Implementation eine ist, für die Überläufe irrelevant und reversibel sind (2er-Komplement).



  • @Dravere: ich habe angenommen dass du von floating point Berechnungen sprichst, da die Frage bei Integer (für mich) sowas von klar ist 🙂

    Wie camper schon schrieb kannst du dich bei Integer auf jeden Fall auf das Ergebnis verlassen, also dass es dem entspricht was der Standard vorgibt. Und der gibt vor dass Klammern bei der Auswertung von Ausdrücken berücksichtigt werden.

    Der Compiler darf, wie camper auch schon schrieb, trotzdem ein Programm erzeugen welches anders rechnet als das was du hinschreibst, wenn garantiert ist dass das Ergebnis stimmt.

    Der Compiler darf sogar viel viel mehr tun - wenn garantiert ist dass das "beobachtbare" Verhalten sich nicht ändert kann er im Prinzip tun was er will. z.B. ganze Berechnungen/Schleifen/... einfach wegoptimieren etc.

    p.S.: was "beobachtbar" ist ist auch im Standard definiert 🙂


  • Administrator

    hustbaer schrieb:

    @Dravere: ich habe angenommen dass du von floating point Berechnungen sprichst, da die Frage bei Integer (für mich) sowas von klar ist 🙂

    Weil es so klar ist, wird es wohl nirgends in meinen Büchern erwähnt, was mich aber genau misstrauisch gemacht hat 🙂
    Wenn ich allerdings schaue, wie oft ich nun so Standard-Spezifische Fragen stelle, glaube ich so langsam, dass sich die Anschaffung des Standards als Buch wirklich lohnen würde 😃

    Danke für die Hilfe!

    Grüssli



  • Dravere schrieb:

    stelle, glaube ich so langsam, dass sich die Anschaffung des Standards als Buch wirklich lohnen würde 😃

    Das glaube ich kaum. Wenn du dann deine 1000 Seiten in der Hand hälst, biste eh nur deprimiert. 😉 - Lad doch lieber den Draft runter. Vor allem, weil du nächstes Jahr wahrscheinlich eh den neuen holen müsstest. 😉


Anmelden zum Antworten