Rückgabe über Referenz



  • Jordy schrieb:

    HumeSikkins schrieb:

    In der ersten Version gibst du eine Referenz auf das lokale Objekt zurück. In der zweiten Version wird ein *Kopie* des lokalen Objekts erzeugt. Das sind zwei völlig verschiedene Paar Schuhe.

    Hm. Wenn dem so ist (das hatte ich auch mal vermutet) dann tut das aber wohl keiner Compiler in der Realität. Auch nicht unter Deaktivierung aller Optimierungen. Jedenfalls - auch wenn es kein Compiler in der Realität macht - ist das natürlich die Erklärung.

    Die Optimierung die hier durchgeführt wird, nennt sich Return-Value-Optimization (RVO). Der Punkt ist auch hier, dass der Copy-Ctor zugreifbar sein muss, selbst wenn der Compiler den eigentlichen Kopiervorgang wegoptimiert.

    Der folgende Code ist z.B. illegal, nichtsdestotrotz wird er von einigen Compilern übersetzt:

    class Typ {
    public:
       Typ(int);
    private
       // Achtung: Copy-Ctor ist private
       // Typ kann niemals by-value returned werden
       Typ(const Typ&);
    };
    
    const Typ func() {
        return Typ(10); // Illegal, selbst wenn Compiler 
                        // die Kopie eleminiert.
    }
    


  • HumeSikkins schrieb:

    Jordy schrieb:

    HumeSikkins schrieb:

    In der ersten Version gibst du eine Referenz auf das lokale Objekt zurück. In der zweiten Version wird ein *Kopie* des lokalen Objekts erzeugt. Das sind zwei völlig verschiedene Paar Schuhe.

    Hm. Wenn dem so ist (das hatte ich auch mal vermutet) dann tut das aber wohl keiner Compiler in der Realität. Auch nicht unter Deaktivierung aller Optimierungen. Jedenfalls - auch wenn es kein Compiler in der Realität macht - ist das natürlich die Erklärung.

    Die Optimierung die hier durchgeführt wird, nennt sich Return-Value-Optimization (RVO). Der Punkt ist auch hier, dass der Copy-Ctor zugreifbar sein muss, selbst wenn der Compiler den eigentlichen Kopiervorgang wegoptimiert.

    Der folgende Code ist z.B. illegal, nichtsdestotrotz wird er von einigen Compilern übersetzt:

    class Typ {
    public:
       Typ(int);
    private
       // Achtung: Copy-Ctor ist private
       // Typ kann niemals by-value returned werden
       Typ(const Typ&);
    };
    
    const Typ func() {
        return Typ(10); // Illegal, selbst wenn Compiler 
                        // die Kopie eleminiert.
    }
    

    Ok, danke. Ist jetzt alles klar.
    Und zudem habe ich gelernt, mich mit Sicherheit nicht mehr auf das Verhalten von konkreten Compiler zu stützen. Naja, eigentlich eine Weisheit die man kennt...


Anmelden zum Antworten