Return Optimierung



  • Bsp1:

    std::string function3_by_value ()
    {
       std::string ergebnis(“foobar“);
       return ergebnis;
    }
    

    Bsp2:

    std::string function3_rvo ()
    {
       return std::string (“foobar“);
    }
    

    function3_rvo zeigt eine leicht abgewandelte Version von function3_by_value, in der das lokale benannte Objekt ergebnis durch ein unbenanntes ersetzt wurde. Dieses ist allerdings selbst noch kein Vorteil gegenüber der ursprünglichen Version. Der Vorteil liegt darin, dass es Compilern erlaubt ist, solche unbenannten Variablen zu eliminieren, d.h. der Compiler kann Code erzeugen, in
    dem weder das unbenannte lokale Objekt innerhalb der Funktion, noch die Kopie der return-by-value Rückgabe existieren. Solche Optimierungen werden als Returnwertoptimierung (engl. return value optimization) bezeichnet und sind in heutigen Compilern weit verbreitet.

    also ich sehe keinen Vorteil hier, bei Bsp1 "ergebnis"(die bekannte Variable) wird nachher auch gelöscht.



  • Der Unterschied ist, wenn eine solche Funktion aufgerufen wird

    std::string test = function3_rvo()
    

    es dem Compiler erlaubt ist test direkt aus std::string("foobar") zu konstruieren. Es fällt ein temporäres Objekt weg. Das ist bei der anderen Funktion nicht der Fall.



  • LordJaxom schrieb:

    Der Unterschied ist, wenn eine solche Funktion aufgerufen wird

    std::string test = function3_rvo()
    

    es dem Compiler erlaubt ist test direkt aus std::string("foobar") zu konstruieren. Es fällt ein temporäres Objekt weg. Das ist bei der anderen Funktion nicht der Fall.

    AFAIK ist dem nicht so.
    Zuweisung ist nicht gleich CopyConstruction (z.B. Typen mit Ref counting).
    T x=a; gleich Tx(a), gilt nur für POD



  • T x=a;

    ist aber keine Zuweisung sonder ebenfalls CopyConstruction. Der Unterschied ist nur, dass das eine direkte Initialiserung ist und das andere nicht.



  • T x = a;
    

    ==

    T x(a);
    

    Aufruf des Copy-Ctor

    T x;
    x = a;
    

    Aufruf des overLoading T& operator=(const T& s);



  • Korrekt. Sind wir uns also einig dass der Compiler obiges Beispiel zu

    std::string test("foobar");
    

    zusammenoptimieren kann, so er denn mag 😉



  • T x=a; gleich Tx(a), gilt nur für POD

    verstehe ich nicht, was passiert wenn in T eine virtuelle Funktion steckt



  • netrobot schrieb:

    T x=a; gleich Tx(a), gilt nur für POD

    verstehe ich nicht, was passiert wenn in T eine virtuelle Funktion steckt

    Dann ist es kein POD mehr.
    T x=a; gleich T x(a) gilt übrigens immer, nicht nur für PODs. Der Unterschied besteht eigentlich nur darin, dass ersteres nicht funktioniert, sofern der ctor explizit ist.


Anmelden zum Antworten