Verhindert std::move Optimierungen?



  • Hallo zusammen,

    die beiden Zeilen in der main-Funktion sollte doch der move-Konstruktor aufgerufen werden, oder?

    #include <iostream>
    class Foo{
    public:
            Foo(){}
            Foo(Foo&& f){
                    std::cout << "move" << std::endl;
            }
            Foo(const Foo& f){
                    std::cout << "copy" << std::endl;
            }
    };
    
    Foo create_foo(){
            Foo foo;
            return foo;
    }
    
    int main(){
            Foo foo = create_foo();
    }
    

    Jetzt optimiert der Compiler diesen Aufruf wahrscheinlich weg, so dass keine Ausgabe erfolgt.

    g++ test.cpp -std=c++0x -O3 -o test

    Wenn allerdings um die rechte Seite ein std::move gemacht wird, dann wird die Ausgabe "move" erzeugt.

    Wieso verhindert ein std::move diese Optimierung? Gibt es da einen Grund oder ist der gcc noch nicht optimal implementiert?

    Gruß,
    XSpille


  • Mod

    XSpille schrieb:

    Wieso verhindert ein std::move diese Optimierung?

    Weil std::move das temporäre Objekt an eine Referenz bindet, damit ist diese Optimierung nicht mehr zulässig.



  • camper schrieb:

    XSpille schrieb:

    Wieso verhindert ein std::move diese Optimierung?

    Weil std::move das temporäre Objekt an eine Referenz bindet, damit ist diese Optimierung nicht mehr zulässig.

    thx


Anmelden zum Antworten