bringen hier rvalues was?
-
Folgende Situation:
vector<T> gen() { vector<T> v; // fülle v; } int main() { vector<T> vec = gen(); }Kann ich da mit rvalues was optimieren?
-
Ja:
vector<T> gen() { vector<T> v; // fülle v; return move(v); } int main() { vector<T> vec = gen(); }http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
-
@dot
Nein. Der vector wird da auch ohne cast gemoved.
-
cooky451 schrieb:
@dot
Nein. Der vector wird da auch ohne cast gemoved.Huch? Was für ein Cast und wieso sollte er da von selber gemoved werden, der Vektor in gen() ist kein rvalue!?
-
Der Code ist schon optimiert dank der copy elision.
Ein explizites move würde den Code hier nur verlangsamen.Im Code von dot zum Beispiel wird 1 Move-Construktor aufgerufen, in deinem keiner.
Ich frage mich echt, woher die fixe Idee kommt, jeden Rückgabewert moven zu müssen. Das ist einfach immer falsch.
-
cooky451 schrieb:
Nein. Der vector wird da auch ohne cast gemoved.
Der wird nicht mal gemoved, der wird gleich passend erstellt.
-
oinknll schrieb:
cooky451 schrieb:
Nein. Der vector wird da auch ohne cast gemoved.
Der wird nicht mal gemoved, der wird gleich passend erstellt.
Das ist eine nicht garantierte Optimierung. Aber die meisten Compiler werden das wohl schaffen, das stimmt.
@dot
move() ist ein Cast auf T&&. Und er wird gemoved. (Sofern nicht optimiert wird.)
-
cooky451 schrieb:
@dot
move() ist ein Cast auf T&&. Und er wird gemoved. (Sofern nicht optimiert wird.)Ok, gut, das meinstest du also mit Cast. Wie genau der Compiler das lvalue von selber moven soll, ist mir allerdings noch nicht klar...
-
dot schrieb:
Wie genau der Compiler das lvalue von selber moven soll, ist mir allerdings noch nicht klar...
Im return Statement sind Funktionslokale Variablen rvalues und werden deshalb gemoved. Ich weiß gerade nicht genau wo das im Standard steht, bin mir aber ziemlich sicher. Kannste ja gern ausprobieren.
-
dot schrieb:
Ja:
vector<T> gen() { vector<T> v; // fülle v; return move(v); } int main() { vector<T> vec = gen(); }http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
müsste das nicht
vector<T>&& gen() { vector<T> v; // fülle v; return move(v); } int main() { vector<T> vec = gen(); }heißen?
-
RVALUE REFERENZEN SIND AUCH NUR REFERENZEN, REFERENZEN AUF LOKALE VARIABLEN ZURÜCKGEBEN IST BÖSE.
Ist das so schwer zu verstehen?

-
dfdsd schrieb:
müsste das nicht
vector<T>&&heißen?
Nein, das wäre eine danling reference. Rvalue-Referenzen sind auch nur Referenzen.
-
cooky451 schrieb:
dot schrieb:
Wie genau der Compiler das lvalue von selber moven soll, ist mir allerdings noch nicht klar...
Im return Statement sind Funktionslokale Variablen rvalues und werden deshalb gemoved. Ich weiß gerade nicht genau wo das im Standard steht, bin mir aber ziemlich sicher. Kannste ja gern ausprobieren.
Etwas zu grob formuliert. Lvalues, die für copy elision in Frage kommen (NRVO) oder kämen, wenn es sich nicht gerade um Funktionsparameter handeln würde, werden zunächst so behandelt als ob es sich um rvalues handeln würde. Sofern die Überladungsauflösung allerdings fehlschlägt oder die gewählte Überladung keine rvalue-Referenz als Parameter hat (z.B. weil die betreffende Klasse nur einen Copy- aber keinen Move-Konstruktor hat), wird der Ausdruck normal als lvalue behandelt.
Alle anderen lvalue-Ausdrücke bleiben auch solche.
12.8/32