Frage

ich vielleicht eine dumme Frage zu stellen, aber ich sah auf der Wikipedia-Seite für RVO hier und fragen konnte nicht aufhören, wenn dieses Verhalten falsch ist. Ich versuchte, es in meiner Maschine und RVO ist vollständig in trotz Optimierungsstufe getreten. Was, wenn es tatsächlich etwas BIG wurde in einem Konstruktor happenning? Ich weiß, es sollte nicht, aber was, wenn? Ich kann nicht verstehen, warum RVO würde immer noch passieren, wenn es Nebenwirkungen im Konstruktor.

EDIT: -fno-elide-constructors scheint RVO zu stoppen. Aber die Frage bleibt.

EDIT2: Auf einer ernsteren Note, wie viele Menschen wissen, über so etwas wie das? Es ist vielleicht in dem Standard, aber es ist immer noch ein wirklich hässlich Feature wie ich es sehe. Mindestens Compiler sollte es standardmäßig deaktivieren und einen Schalter für die Menschen, die darüber Bescheid wissen. :)

EDIT 3: Ich immer noch darauf bestehen, dass dies wirklich schlecht ist. :). Ich glaube nicht, dass ich von einer anderen Sprache Zwang wie diese kennen, die direkt gegen die Syntax der Sprache geht. Alles andere führt entweder Compiler oder Linker Fehler nicht wahr?

War es hilfreich?

Lösung

Die Standard-Mandate, dass Operationen mit Sorge ein Programm beobachtbaren Zustand muss nicht weg optimiert werden, mit Ausnahme Kopie Bau unter bestimmten Umständen. Sie müssen nicht auf Kopierkonstruktoren verlassen ausgeführt werden, auch wenn sie Nebenwirkungen haben Sie erwarten zu sehen (zum Beispiel Konsolenausgabe).

Andere Tipps

, sagte Wie in den anderen Antworten, der Compiler optimize erlaubt ist weg auch nicht trivial Kopierkonstruktoren und Zuweisungsoperator.

  

12.8.15

     

Wenn bestimmte Kriterien erfüllt sind, wird eine Implementierung wegzulassen die Kopie Bau eines Klassenobjekts erlaubt, auch wenn   der Kopierkonstruktor und / oder Destruktor für das Objekt haben Nebenwirkungen . In solchen Fällen behandelt die Umsetzung der   Quelle und Ziel des Kopiervorgangs ausgelassen, da einfach zwei verschiedene Arten auf das gleiche Objekt Bezug genommen wird, und die   Zerstörung des Objekts tritt bei dem späteren der Zeiten, in denen die beiden Objekte ohne die zerstört worden wäre,   Optimierung. Diese Auslassung der Kopiervorgänge ist in den folgenden Umständen erlaubt (die kombiniert werden können,   mehr Kopien zu eliminieren):

     

- in einer return-Anweisung in einer Funktion mit einem Klasse Rückgabetyp, wenn der Ausdruck ist der Name eines nichtflüchtigen   automatisches Objekt mit dem gleichen cv-unqualifizierten Typ wie der Funktionsrückgabetyp, kann der Kopiervorgang entfallen   durch das automatische Objekt direkt in die Funktion des Rückgabewert Konstruktion

     

- wenn ein temporäres Klasse-Objekt, das auf eine Referenz (12.2) nicht zu einem Klassenobjekt würde kopiert gebunden hat mit   die gleiche cv-unqualifizierten Typ kann der Kopiervorgang durch Aufbau der temporären Objekt direkt weggelassen werden, in   das Ziel der weggelassen Kopie

Definieren Sie "falsch". Die Sprache C ++ erlaubt ausdrücklich diese Art von Optimierung, obwohl es zu beobachten ist. Wenn das Verhalten Ihres Programms ist abhängig von einer spezifischen Implementierung, dann leider sind Sie nicht ISO C ++, aber einiger Dialekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top