Wann sollte RVO einspringen?

8

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: Ссылка

    
James McNellis 08.01.2010, 06:29
quelle

4 Antworten

8

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%     
jalf 08.01.2010 12:31
quelle
4

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.

    
Terry Mahaffey 08.01.2010 07:03
quelle
2

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.

    
R Samuel Klatchko 08.01.2010 06:40
quelle
1

Sie scheinen RVO falsch zu verstehen, versuchen Sie dieses Beispiel (eigentlich NRVO) :

%Vor%     
Georg Fritzsche 08.01.2010 06:37
quelle