Smart Pointer als Parameter - Performance



  • Hallo.
    Wenn ich einen Smart Pointer von einem Großen Objekt habe,
    kann ich den ohne bedenken(Performance) ohne Referenz als Funktions Parameter benutzten?

    void foo(std::unique_ptr<BigObject> obj);
    

    oder sollte man lieber

    void foo(std::unique_ptr<BigObject>& obj);
    

    machen?



  • Ich glaube, du hast smart pointer nicht verstanden, denn wenn du

    void foo(std::unique_ptr<BigObject>& obj)
    

    als Ersatz fuer

    void foo(std::unique_ptr<BigObject> obj);
    

    schreiben kannst/moechtest, dann kannst du auch gleich

    void foo(BigObject* obj)
    

    schreiben, da keine Besitzverhaeltnisse transferiert werden.



  • DuffCola schrieb:

    Wenn ich einen Smart Pointer von einem Großen Objekt habe,
    kann ich den ohne bedenken(Performance) ohne Referenz als Funktions Parameter benutzten?

    void foo(std::unique_ptr<BigObject> obj);
    

    oder sollte man lieber

    void foo(std::unique_ptr<BigObject>& obj);
    

    machen?

    Kann man pauschal nicht beantworten. Es kommt drauf an, was das für eine Übergabe sein soll, ob foo sich den Zeiger irgendwo wegspeichert, ob foo den "Besitz" (teilweise) übernehmen soll, ...

    Das erste ist in Ordnung, wenn foo eine Senke ist, an die du das Objekt abtreten willst.

    Das zweite sieht nach einem "out-Parameter" aus.

    Wenn die Funktion nur kurz irgendwas mit dem BigObject machen soll und sich dessen Adresse nicht wegspeichert, wäre es völlig legitim, einen rohen Zeiger bzw eine Referenz zu verwenden:

    void foo(BigObject& bor);
    
    int main()
    {
      :::
      foo(*my_shared_pointer_variable);
      :::
    }
    


  • kann ich den ohne bedenken(Performance) ohne Referenz als Funktions Parameter benutzten?

    Klar, intern ist ein Smart-Pointer auch nur der unterliegende Zeiger, der dann beim Move kopiert wird.

    Wie allerdings schon erklärt wurde, ist der Anwendungsfall (mit Referenz) diskutabel. Vor allem drücken beide Funktionssignaturen zwei verschiedene Dinge aus. Daher ist es vielleicht performance-technisch dasselbe, aber definitiv nicht semantisch.

    Kann man pauschal nicht beantworten. Es kommt drauf an, was das für eine Übergabe sein soll, ob foo sich den Zeiger irgendwo wegspeichert, ob foo den "Besitz" (teilweise) übernehmen soll, ...

    Also ich gehe mal davon aus, dass es nur um die Übergabe geht, nicht darum, was intern noch gemacht wird.



  • kurze Bemerkung am Rande: std::unique_ptr kann man gar nicht kopieren, darin besteht der Sinn von std::unique_ptr. man kann den Inhalt nur in einen anderen std::unique_ptr moven, wobei dann auch die ownership übertragen wird 😉



  • Wenn du einen SmartPointer kopieren willst ( call-by-value ), dann mögest du lieber einen shared_ptr verwenden.



  • It0101 schrieb:

    Wenn du einen SmartPointer kopieren willst ( call-by-value ), dann mögest du lieber einen shared_ptr verwenden.

    Falsche Begruendung.


Anmelden zum Antworten