2013-04-27 10 views
5

Einige Bücher sagen, dass Code den Kopierkonstruktor auslöst, aber g ++ wird es so optimieren, dass der Kopierkonstruktor nicht aufgerufen wird.Warum kann -Occ nicht die GCC-Kompilierungsoptimierung deaktivieren?

Allerdings habe ich den Befehl ++ -OO verwendet, um die Optimierung zu deaktivieren, aber es kann immer noch nicht den Kopierkonstruktor auslösen.

Wie man es versteht?

+0

Wie ermitteln Sie, ob der Kopierkonstruktor aufgerufen wurde? –

+0

Ich überschreibe den Kopierkonstruktor und log genannt – jiafu

+0

Meine Vermutung ist, dass an einem Ort g ++ macht konstante Faltung/Ausbreitung - möglicherweise im Frontend. Und ich denke du kannst das nicht deaktivieren. – JohnTortugo

Antwort

9

Mit GCC und Clang können Sie das Kompilierungsflag -fno-elide-constructors verwenden, um die Kopier-/Verschiebungsoptimierung zu deaktivieren.

+0

Warum o0 kann nicht funktionieren? – jiafu

+0

Ich möchte nicht alle zu Tigger kopieren, sondern das grundlegende Prinzip zu studieren, um – jiafu

+0

@ Jiafu zu verstehen: Ich bin mir nicht sicher, warum '-o0' wird nicht helfen, Kopie/Move Elision zu hemmen. Wenn Sie dieses Verhalten unterdrücken möchten, müssen Sie dieses Flag verwenden. –

1

Die Kopierregel basiert auf ISO C++ 12.8. Während andere Regeln, die allgemein zur Optimierung verwendet werden, kollektiv als "als-ob" -Regel in Klausel 1 bezeichnet werden (was zulässt, dass sich die Implementierung Programm mit der "nicht optimierten" Programm-Semantik basierend auf dem abstrakten Maschinenmodell etwas anders verhält), ist diese Regel so Speziell, dass Sie den "optimierten" Code selbst behandeln können, verhält sich so genau wie die ursprüngliche Bedeutung. Mit anderen Worten, die elided Konstruktoraufrufe möglicherweise nicht im Verhalten der abstrakten Maschine vorhanden.

Wenn es kein undefiniertes Verhalten ist, mit oder ohne Optimierung des As-if-Regeln nach dem beobachtbares Verhalten des optimierten Programms und nicht-optimierte Programms soll gleich sein (obwohl sie auf der Leistung unterscheiden, usw.) . Die Kopie ist jedoch aggressiver, dh sie kann das beobachtbare Verhalten verändern.

Sie sollten sich besser nicht auf die Unterschiede verlassen, die durch copy elision entstehen. Daher ist es sinnvoll, das gleiche Verhalten für gewöhnliche Optimierungsoptionen beizubehalten und eine separate Option bereitzustellen, um das genaue (unterschiedliche) Verhalten für Benutzer zu steuern, die die Risiken gut kennen und tatsächlich benötigen.

WG21/N4296

1,9 Programmausführung

5 Ein konforme Implementierung ein wohlgeformtes Programm ausführt wird das gleiche beobachtbares Verhalten als eine der möglichen Ausführungen der entsprechenden Instanz erzeugen die abstrakte Maschine mit dem gleichen Programm und den gleichen Eingang. Wenn jedoch eine solche Ausführung eine nicht definierte Operation enthält, stellt dieser internationale Standard keine Anforderung an die Implementierung, die das Programm mit dieser Eingabe ausführt (nicht einmal in Bezug auf Operationen, die der ersten undefinierten Operation vorausgehen).

8 Die am wenigsten Anforderungen an eine konforme Implementierung sind:

(8,1) - Zugang zu flüchtigen Objekte sind streng beurteilt nach den Regeln der abstrakten Maschine.

(8,2) - Bei Beendigung des Programms werden alle in Dateien geschriebenen Daten werden zu einem der möglichen Ergebnisse, dass Ausführung des Programms nach der abstrakten Semantik erzeugt wäre identisch sein.

(8.3) - Die Eingabe- und Ausgabedynamik interaktiver Geräte soll so erfolgen, dass die Ausgabe tatsächlich ausgegeben wird, bevor ein Programm auf die Eingabe wartet. Was ein interaktives Gerät ausmacht ist implementierungsdefiniert.

Diese zusammen werden als beobachtbares Verhalten des Programms bezeichnet. [Hinweis: Verschärfende Entsprechungen zwischen abstrakter und tatsächlicher Semantik können von jeder Implementierung definiert werden. -Ende note]

12.8 Kopieren und Verschieben von Klassenobjekten

31 Wenn bestimmte Kriterien erfüllt sind, wird eine Implementierung erlaubt das Kopieren/Verschieben Bau einer Klasse Objekt zu verzichten, auch wenn der Konstruktor ausgewählt für Die Copy/Move-Operation und/oder der Destruktor für das Objekt haben Nebenwirkungen. In solchen Fällen behandelt die Implementierung die Quelle und das Ziel der ausgelassenen Operation Kopieren/Verschieben als einfach zwei verschiedene Arten des Verweises auf das gleiche Objekt, und die Zerstörung dieses Objekts tritt zu dem späteren Zeitpunkt auf, wenn die beiden Objekte dies tun würden Diese Auslassung von kopieren/verschieben-Operationen ohne die optimization.122 zerstört, Kopie elision genannt wurde, wird in den folgenden Fällen zulässig (die kombiniert werden kann, mehrere Kopien zu eliminieren):

...

Verwandte Themen