Was ist die " als ob " -Regel?
Die " Als-ob " -Regel definiert grundsätzlich, welche Transformationen eine Implementierung in einem legalen C ++ - Programm ausführen darf. Kurz gesagt, alle Transformationen, die das " beobachtbare Verhalten " eines Programms nicht beeinflussen (siehe unten für eine genaue Definition), sind zulässig.
Ziel ist es, Implementierungen die Freiheit zu geben, Optimierungen durchzuführen, solange das Verhalten des Programms mit der vom C ++ - Standard in Bezug auf eine abstrakte Maschine festgelegten Semantik übereinstimmt.
Wo führt der Standard diese Regel ein?
Der C ++ 11 Standard führt die " Als-ob " -Regel in Abschnitt 1.9 / 1 ein:
Die semantischen Beschreibungen in dieser Internationalen Norm definieren eine parametrisierte nichtdeterministische abstrakte Maschine. Diese Internationale Norm stellt keine Anforderungen an die Struktur konformer Implementierungen. Insbesondere müssen sie die Struktur der abstrakten Maschine nicht kopieren oder emulieren. Vielmehr sind konforme Implementierungen erforderlich, um (nur) das zu emulieren beobachtbare Verhalten der abstrakten Maschine wie nachstehend erläutert.
Eine erklärende Fußnote fügt hinzu:
Diese Bestimmung wird manchmal als "Als-ob" -Regel bezeichnet , da eine Implementierung frei ist, eine Anforderung dieser Internationalen Norm zu ignorieren, solange das Ergebnis so ist, als ob die Anforderung eingehalten worden wäre, soweit sich aus dem beobachtbaren Verhalten ergibt des Programms. Beispielsweise muss eine tatsächliche Implementierung keinen Teil eines Ausdrucks bewerten, wenn daraus geschlossen werden kann, dass sein Wert nicht verwendet wird und keine Nebenwirkungen auftreten, die das beobachtbare Verhalten des Programms beeinflussen.
Was genau schreibt die Regel vor?
In Absatz 1.9 / 5 wird ferner Folgendes festgelegt:
Eine konforme Implementierung , die ein wohlgeformtes Programm ausführt, muss dasselbe beobachtbare Verhalten erzeugen wie eine der möglichen Ausführungen der entsprechenden Instanz der abstrakten Maschine mit demselben Programm und derselben Eingabe . Wenn eine solche Ausführung jedoch eine undefinierte Operation enthält, stellt diese Internationale Norm keine Anforderung an die Implementierung, die dieses Programm mit dieser Eingabe ausführt (nicht einmal in Bezug auf Operationen, die der ersten undefinierten Operation vorausgehen).
Es ist hervorzuheben, dass diese Einschränkung nur beim "Ausführen eines wohlgeformten Programms" gilt und dass die möglichen Ergebnisse der Ausführung eines Programms, das undefiniertes Verhalten enthält, nicht eingeschränkt sind. Dies wird auch in Absatz 1.9 / 4 explizit ausgeführt:
Bestimmte andere Operationen werden in dieser Internationalen Norm als undefiniert beschrieben (z. B. der Effekt des Versuchs, ein const-Objekt zu ändern). [Hinweis: Diese Internationale Norm stellt keine Anforderungen an das Verhalten von Programmen, die undefiniertes Verhalten enthalten . - Endnote]
In Bezug auf die Definition von " beobachtbarem Verhalten " lautet Ziffer 1.9 / 8 schließlich wie folgt:
Die geringsten Anforderungen an eine konforme Implementierung sind:
- Der Zugriff auf flüchtige Objekte wird streng nach den Regeln der abstrakten Maschine bewertet.
- Bei Programmbeendigung müssen alle in Dateien geschriebenen Daten mit einem der möglichen Ergebnisse identisch sein, die die Ausführung des Programms gemäß der abstrakten Semantik ergeben hätte.
- Die Eingabe- und Ausgabedynamik interaktiver Geräte muss so erfolgen, dass die Aufforderung tatsächlich ausgegeben wird, bevor ein Programm auf die Eingabe wartet. Was ein interaktives Gerät ausmacht, ist implementierungsdefiniert.
Diese werden zusammen als beobachtbares Verhalten des Programms bezeichnet . [ Hinweis : Jede Implementierung kann strengere Entsprechungen zwischen abstrakter und tatsächlicher Semantik definieren. - Endnote ]
Gibt es Situationen, in denen diese Regel nicht gilt?
Nach meinem besten Wissen ist die einzige Ausnahme von der " Als-ob " -Regel die Kopier- / Verschiebungselision, die zulässig ist, obwohl der Kopierkonstruktor, der Verschiebungskonstruktor oder der Destruktor einer Klasse Nebenwirkungen haben. Die genauen Bedingungen hierfür sind in Abschnitt 12.8 / 31 angegeben:
Wenn bestimmte Kriterien erfüllt sind, kann eine Implementierung die Kopier- / Verschiebungskonstruktion eines Klassenobjekts weglassen, selbst wenn der für die Kopier- / Verschiebungsoperation ausgewählte Konstruktor und / oder der Destruktor für das Objekt Nebenwirkungen haben . [...]