Move Semantic vs. std::unique_ptr



  • Hi,

    seit C++11 kann man ja durch die Move Semantik große Strukturen elegant als Rückgabewert von Funktionen verwenden.
    Häufig kann ich mich allerdings nicht entscheiden, ob ich die Struktur 'moven' oder als unique_ptr zurückgeben soll.
    Natürlich hat der unique_ptr zusätzlich viel mehr zu bieten, aber gibt es grundlegende Argumente welchen Ansatz man für welche Situation verwenden sollte?

    HugeClass create();
    std::unique_ptr<HugeClass> create();
    

  • Mod

    seit C++11 kann man ja durch die Move Semantik große Strukturen elegant als Rückgabewert von Funktionen verwenden.

    Konnte man vorher dank copy elision auch. Es gibt bei unique_ptr diesbezüglich keinen Vorteil; es werden i.d.R. keinerlei Moves oder Kopien gespart.



  • Ich meinte das nicht nur auf die Geschwindigkeit, sondern insbesondere auch auf die Ownership bezogen.

    class Foo {
    public:
        void giveMeAnImage(Image&&);
        void giveMeAnImage(std::unique_ptr<Image>);
    private:
        std::unique_ptr<Image> ptrImg;
        Image img;
    }
    

    Der Nachteil bei der move semantic wäre, dass zu Begin ein gültiges, aber leeres Image Objekt besteht.

    Ich glaube allerdings, dass ich ein Problem konstruiere wo keines ist ...



  • Wenn Image keinen Standardkonstruktor hat, kann man boost::optional<Image> nehmen.



  • Wenn sich Image moven lässt, dann gibe es keinen Grund, wieso es keinen Default-Konstruktor haben könnte. Denn den "leeren State" muss es sowieso geben (nach einen move).


Anmelden zum Antworten