2013-01-20 6 views
6

Lassen Sie uns sagen, dass ich die Funktion haben,Kann ein C++ - Compiler RVO für einen konstanten Rückgabewert ausführen?

#include <string> 

std::string const foo() 
{ 
    std::string s = "bar"; 
    return s; 
} 

int main() 
{ 
    std::string t = foo(); 
} 

Kann ein Compiler ausführen (benannt) return-Wert-Optimierung für t, obwohl die Arten von s und t sind beide verschieden von der Rückgabetyp foo aufgrund der const -Nessunterschied?

(Lautet die Antwort anders für C++ 03 und C++ 11 dann bin ich auf jeden Fall daran interessiert, die C++ 03 Antwort zu wissen.)

+0

Warum fügen Sie die Ergebnisse Ihrer Experimente nicht mit mindestens einem Compiler ein? –

+0

@MarcGlisse: Nun, Visual C++ 2008 hat es weg optimiert, aber ich bin mir nicht sicher, ob der Standard es tatsächlich erlaubt oder nicht. – Mehrdad

Antwort

7

Es gibt keine Möglichkeit für RVO-Optimierung brechen die Versprechen von const, also gibt es kein Problem: RVO kann durchgeführt werden.


jedoch bewegen Semantik wird von der const betroffen. Es deaktiviert effektiv die Bewegungssemantik, dh die Aufrufe eines T(T&&) Konstruktors oder eines Zuweisungsoperators. Verwenden Sie also im Allgemeinen const nicht für einen Rückgabewert.

Scott Meyers ursprünglich empfohlen const auf Rückgabewerte, für mehr vernünftige Codierung.

Dann Andrej Alexandrescu, in seinem Mojo Artikel für DDJ, darauf hingewiesen, dass fortan, mit Bewegung Semantik, const auf Rückgabewerte besser verboten werden sollte, und Scotts früheren Rat ignoriert.


Jetzt habe ich nie die verschiedenen spezialisierten RVO-Abkürzungen gelernt, wie NRVO und so weiter. Und ein Hauptgrund ist, dass diese die Bedeutung auf halbem Weg geändert haben, ursprünglich eine Bedeutung mit einigen benutzerdefinierten Funktionen im g ++ - Compiler. Die Terminologie hier ist nur ein Durcheinander.

Also, wenn meine Terminologie falsch ist und ich wirklich ein anderes Akronym verwendet haben sollte, dann zögern Sie nicht zu korrigieren! :-)

+0

+1 guter Punkt in Bezug auf Move-Semantik, obwohl es mich wundern lässt: Also, was ist falsch mit Move Semantik mit einem konstanten Rückgabewert deaktivieren? Ist nicht RVO (was die Instanziierung eines Objekts vollständig verhindert) immer noch besser als die Bewegung (die ein Objekt noch instanziieren und Wartungsarbeiten ausführen muss, um die tatsächliche Bewegung auszuführen)? – Mehrdad

+0

@Mehrdad: Move Semantik ist unter der Kontrolle des Programmierers, und der Compiler hat nichts zu sagen, während RVO unter Compiler-Kontrolle ist, und der Programmierer hat fast nichts zu sagen. zum Beispiel könnte der Aufruf eine Zuweisung 's = foo()' anstelle einer Initialisierung sein. dann verhindert die 'const' das Verschieben des Pufferspeichers des Funktionsstring-Ergebnisses: Es wird höchstwahrscheinlich kopiert, wobei möglicherweise noch ein weiterer Puffer zugewiesen wird. –

+0

Okay, aber wenn ich weiß, dass RVO passiert, wird es * niemals * (in der Praxis) langsamer sein als ein Zug, oder? Wenn Sie also ROVO sicherstellen können, ist die Rückgabe von "const" also besser als die Rückgabe von mutable? – Mehrdad

Verwandte Themen