2017-01-25 1 views
3

Ist Compiler erlaubt, einen überladenen Postfix-Operator zu optimieren und durch den Präfixoperator zu ersetzen? (Vorausgesetzt, dass Compiler weiß, was Funktion überlastet tut)Überladene Präfix/Postfix-Compiler-Optimierung

Zum Beispiel in dem folgenden Code, die meisten Compiler i++ als ++i behandeln und derselben Baugruppe erzeugen.

for(int i=0; i<5; i++) 
    printf("*"); 

Dann könnte das gleiche für den folgenden Code gelten?

class Integer { 
    int data; 
    Integer& operator++() { ++data; return *this; } 
    Integer operator++(int) { Integer ret = *(this); ++(*this); return ret; } 
    // And more overloads... 
}; 

for(Integer i=0; i<5; i++) 
    printf("*"); 

Antwort

4

ist ein optimiser etwas so lange, wie es das Verhalten des Codes ändert sich nicht tun erlaubt. (Dies als the "as-if" rule bekannt.)

Also ja, in Ihrem ersten Schnipsel ++i und i++ werden auf den meisten Compiler auf dasselbe hinaus optimiert werden. (Obwohl das früher nicht der Fall war, verwenden alte Katzen wie ich immer noch ++i in einer for Schleife.).

Im zweiten Fall könnte der Compiler die Wertkopie als Teil einer Erweiterung der benannten Rückgabewertoptimierung (NRVO) optimieren, vorausgesetzt, das zurückgegebene Ergebnis wird nicht verwendet.