Was wird hier eigentlich zurückgeben



  • Wenn ich so ein Methode hier habe

    std::vector<T> makeItSo(...)
    ...
    return vec;
    

    Was passiert dann eigentlich mit dem vec Objekt. Wird das dann kopiert? Und wenn ja, dann müsste ich ja eine Pointer zurückgeben, damit das nicht passiert?



  • Theoretisch müsste der vector kopiert werden. Praktisch gibts aber Tricks wie (Named) Return Value Optimization.



  • Wenn ein move ctor vorhanden ist, wird dieser verwendet. Bzw. wenn Optimierungen aktiviert sind, wird von den meisten Compilern diese Kopie wegoptimirt.
    http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/



  • -.-



  • HändyÄndy schrieb:

    Und wenn ja, dann müsste ich ja eine Pointer zurückgeben, damit das nicht passiert?

    Nein, es sei denn, du willst den Benutzer zu dynamischer Speicherverwaltung zwingen, von der er nicht ohne Weiteres weiss, wie er den Speicher wieder freizugeben hat. Vermeide rohe besitzende Zeiger und manuelle Speicherverwaltung wo möglich.

    Flexibel bezüglich Speicherverwaltung wäre ein Output-Parameter.

    void Function(std::vector<T>& out);
    

    Flexibel bezüglich Container-Wahl wäre eine Iterator-Schnittstelle.

    template <typename OutputIterator>
    void Function(OutputIterator out);
    

    Flexibel bezüglich Benutzung als temporäres Objekt wäre ein Smart-Pointer.

    std::auto_ptr< std::vector<T> > Function();
    

    Und naheliegend wäre Wertrückgabe. Ab und zu lohnt es sich, einfache Wege zu gehen.

    std::vector<T> Function();
    

Log in to reply