Stil-Frage



  • Hallo zusammen,

    ich habe mal eine Frage: Was ist besser/schöner/effizienter?

    Variante a)

    void foo(List & aList){
    //add something to the list
    }
    
    void bar(){
    List a;
    foo(a);
    }
    

    oder b)

    List foo(){
    List a;
    //add something to the list
    return a;
    }
    
    void bar(){
    List a = foo();
    }
    

    Klar, Version b macht ne Kopie und ist daher wohl nicht so effizient wie a, aber ich finde es schöner, weil man da gleich sieht, was Eingabe und Rückgabe ist. Gibt es sonst noch Argumente für die ein oder andere Variante? Oder ist das heutzutage vielleicht egal, weil der GCC das schon optimiert? Vielen Dank für Antworten.

    Gruß
    uwe


  • Mod

    Es ist ausdrücklich vom Sprachstandard erlaubt, diese Kopie weg zu optimieren, selbst wenn dadurch die Semantik des Programms verändert würde (Kopierkonstruktor mit Seiteneffekten). Dies nennt man return value optimization (RVO) und ist eine ganz grundlegende Optimierung, die daher so ziemlich jeder Compiler beherrscht. Schwierig wird's für den Compiler jedoch, wenn du solche Konstrukte hast:

    List foo()
    {
     List listA, listB;
    
     // ...
    
     if (irgendwas)
      return listA;
     else
      return listB;
    }
    


  • Vielen Dank, das Stichwort RVO war hilfreich 🙂


  • Mod

    SeppJ schrieb:

    Es ist ausdrücklich vom Sprachstandard erlaubt, diese Kopie weg zu optimieren, selbst wenn dadurch die Semantik des Programms verändert würde (Kopierkonstruktor mit Seiteneffekten). Dies nennt man return value optimization (RVO) und ist eine ganz grundlegende Optimierung, die daher so ziemlich jeder Compiler beherrscht. Schwierig wird's für den Compiler jedoch, wenn du solche Konstrukte hast:

    List foo()
    {
     List listA, listB;
    
     // ...
    
     if (irgendwas)
      return listA;
     else
      return listB;
    }
    

    In diesem Fall kann muss der (C++11-kompatible) Compiler allerdings move-Konstruktion einsetzen, sofern verfügbar.
    Es gibt deshalb von vornherein (fast immer) keinen Grund mehr, eine andere Methode der Rückgabe zu verwenden.


Anmelden zum Antworten