C++-Verwendung von std::move für die Rückgabe des Rvalue-Funktionsparameters?C++

Programme in C++. Entwicklerforum
Anonymous
 C++-Verwendung von std::move für die Rückgabe des Rvalue-Funktionsparameters?

Post by Anonymous »

NRVO/RVO-Regeln erlauben/erfordern das Eliminieren von Kopien, wenn ein (nicht bedingter) Rückgabewert von der aufgerufenen Funktion erstellt wird – er muss am Rückgabewertspeicherort des Stack-Frames des Aufrufers erstellt werden (obwohl primitive Typen möglicherweise in einem Register zurückgegeben werden).
Andernfalls werden zurückgegebene R-Werte (temporär) verschoben (wenn möglich) und sogar lokale L-Werte (benannt) werden ebenfalls verschoben.
Übergebene Funktionsparameter Werte werden vom Aufrufer erstellt – sind keine Kandidaten für RVO – und werden ähnlich wie lokale L-Werte verschoben.
Vom Aufrufer verschobene Funktionsparameter (sowie als Referenz übergebene Funktionsparameter) scheinen für eine implizite Verschiebungsrückgabe nicht geeignet zu sein.
Da NRVO/RVO nicht möglich ist, gibt es irgendwelche Nachteile bei einer expliziten Verschiebung eines Rückgabewerts, der selbst ein verschobener Funktionsparameter ist? Es kann die noch bessere Optimierung von RVO, wie ich es verstehe, nicht blockieren. Sind die obigen Aussagen falsch?

[Tests mit GNU C++17 unterstützen die Theorie, dass eine implizite Verschiebung bei Rückgabe von in die Funktion verschobenen Parametern nicht durchgeführt wird – beweisen es mir aber nicht].
Beispiel:

Code: Select all

T foo(T&& t) { return std::move(t); }

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post