Aus dem folgenden Code, wenn RVO passiert ist, erwarte ich, dass die 2 Adressen auf den gleichen Ort zeigen, aber das ist nicht der Fall (mein Compiler ist MS VC9.0)
%Vor%Unter welchen Bedingungen sollte RVO geschehen?
Übrigens stütze ich meine Frage auf die folgende Diskussion: Ссылка
RVO wird im Allgemeinen angewendet, wenn Sie ein unbenanntes temporäres, aber nicht zurückgeben, wenn Sie ein zuvor erstelltes Objekt zurückgeben.
%Vor%Eine allgemeinere Version ist NRVO (Named Return Value Optimization), die auch bei benannten Variablen funktioniert.
%Vor%Die richtige Antwort lautet "wann immer der Compiler gefällt". Ein solches Verhalten ist vom Standard nicht vorgeschrieben (ist aber erlaubt), und die genauen Bedingungen, unter denen es einsetzt, variieren von Compiler zu Compiler und von Version zu Version.
In der Regel ist der Compiler intelligenter als Sie und arbeitet in Ihrem besten Interesse. Frag es nicht.
rvalue Verweise in C ++ 0x sind eine Art manuelle Version von RVO.
Bearbeiten: Wenn Sie sich Ihren Code genauer ansehen, verstehen Sie RVO definitiv falsch. Da Ihr Parameter eine Referenz ist, gibt es keine Möglichkeit, dass der Rückgabewert der Funktion die gleiche Adresse hat.
Ich kenne die vollständigen Bedingungen nicht, aber ich glaube, die Tatsache, dass Sie einen Parameter und keine in der Funktion erstellte Instanz zurückgeben, verursacht das Problem in Ihrem Beispiel.
Für mich zeigte das Folgende die gleiche Adresse für beide:
%Vor%Folge zu Darids Kommentar
Das Codepad über die Seite dokumentiert, dass dafür die -fno-elide-Konstruktoren für C ++ verwendet werden. Die Dokumentation für diese Option bildet den g ++ Manpage-Status:
Der C ++ - Standard erlaubt einer Implementierung, das Erstellen eines zu unterlassen temporary, das nur zum Initialisieren eines anderen Objekts des dieselbe Art. Die Angabe dieser Option deaktiviert diese Optimierung und zwingt G ++, den Kopierkonstruktor in allen Fällen aufzurufen.
Auf meinem Rechner verhindert das Kompilieren mit -fno-elide-constructors RVO, aber Kompilieren ohne es zuzulassen.
Sie scheinen RVO falsch zu verstehen, versuchen Sie dieses Beispiel (eigentlich NRVO) :
%Vor%Tags und Links c++ return-value return-value-optimization