Move Semantik vs. Call by Reference



  • Hallo ihr Lieben,

    ich habe mal wieder eine naive Frage: Wie der Titel schon andeutet, was genau ist der Unterschied zwischen (seit C++11) std::move und (dem guten alten?) call by reference?

    Ich habe die naive Ansicht, dass in beiden Fällen das Kopieren umgangen werden möchte, was bei großen Datenmengen (lange Vektoren?) sehr lange dauern kann. Aber das erreiche ich doch auch durch ein einfaches Call by Reference.

    Kann es an dem Wunsch der Ressourcenverwaltung liegen? Denn durch ein std::move geht der Vektor tatsächlich an das aufrufende Objekt über, d.h. wenn z.B. eine Funktion den Vektor mitels std::move bekommt, die Funktion fertig ist ... dann wäre auch der Vektor weg.

    Durch Call by Reference wäre die Funktion nur in der Lage Änderungen am Vektor vorzunehmen, 'die bleiben'.

    Gruß,
    -- Klaus.



  • Mit Move-Semantik überträgst du den Besitz, (LValue-)Referenzen sind hingegen nur passive Verweise, die nichts an den Besitzverhältnissen ändern.



  • Alte Verhaltensweise:

    string foo()
    foo.push_back(getString());
    

    Alte Verhaltensweise:
    getString gibt einen String (temporär) zurück. push_back nimmt diesen String als als konstante Referenz (hier keine Kopie) und kopiert ihn an die richtige Stelle. Dann wird das temporäre Objekt gelöscht.

    Neue Verhaltensweise:
    getString gibt einen String (temporär) zurück. push_back nimmt diesen String als RValue-Reference (hier keine Kopie) und verschiebt die Daten an die richtige Stelle. Das temporäre Objekt wird gelöscht, hat aber gar keine Daten mehr.

    Beim ersten wird das Objekt vom Aufruf nicht kopiert, aber beim Einfügen, auch dann wenn man es ohnehin nicht mehr braucht. Beim zweiten findet diese Kopie nur statt, wenn es wirklich nötig ist.


Anmelden zum Antworten