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
-
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