Vermeidung der RÜckgabe einer lokalen Variable



  • Hallo,

    ist das ein gängiger Weg, die Rückgabe einer lokalen Variable zu vermeiden:

    std::vector<char> doSomething() {
     std::vector<char> tmp; // lokale Variable
     // Befülle tmp usw.
     return std::vector<char>(tmp); // Rückgabe eines neuen Objektes durch Kopierkonstruktor
    }
    

    Oder fällt euch was geschickteres ein?



  • der kopierkonstruktor wird implizit aufgerufen.
    probleme hast du nur, wenn du eine referenz (also referenzen oder zeiger) auf ein lokales objekt zurückgibst, nicht aber kopien.

    vector<char> foo ()
    {
       vector<char> tmp;
    
       //...
       return tmp;
    }
    
    //aufruf:
    vector<char> x = foo();
    

    gute compiler machen dir daraus wohl denselben maschinencode, als würdest du folgendes (auf den ersten blick) "schnelleres" konstrukt verwenden

    void foo (vector<char>& tmp)
    {
       //...
    }
    
    //aufruf:
    vector<char> x;
    foo(x);
    


  • Kommt auf die Verwendung an. Aber hier würde ich eher zur Übergabe per Referenz tendieren und dann den vector füllen.


  • Mod

    Es gibt keinen Grund, die Rückgabe vermeiden zu wollen, wenn sie dort richtig ist. Überflüssig und unnütz ist dagegen das Erstellen einer Kopie beim return, tatsächlich wird damit eine wesentliche Optimierung, nämlich NRVO, unmöglich gemacht. Der Ersatz durch Referenzübergabe wiederum durchbricht Abstraktionsschichten, erhöht die Koppelung zwischen Aufrufer und aufgerufener Funktion, gibt unnötig Verantwortung an den Aufrufer ab (der sich nun um die Erzeugung des Objektes kümmern muss), erhöht die Komplexität, erschwert Optimierungen und ist allgemein schlecht für die Gesundheit.



  • Da ich die Schnittstelle der Funktion nicht verändern darf, ist also das hier am besten:

    vector<char> doSomething() {
     vector<char> tmp;
     // Befülle tmp usw.
     return tmp;
    }
    

    Oder?



  • Yo, wie sonst? Meistens ist es einfacher als man denkt.



  • Sollte dabei natürlich (eigentlich immer) bei der Rückgabe von Kopien eigener Objekte eigener Klassen darauf achten das der Kopierkonstruktor auch vernünftig definiert ist und nicht nur eine oberflächliche Kopie erstellt wird wo dies nicht erwünscht ist.


Anmelden zum Antworten