Nehmen Sie eine API an, in der jede Funktion einen Fehlercode zurückgibt, der Null ist, wenn kein Fehler vorliegt, und ungleich Null für Fehlerwerte.
Lassen Sie
%Vor% sind Funktionen in dieser API. Es soll ein Codefragment geben, in dem foo
und bar
in der Reihenfolge aufgerufen werden müssen und foo und bar sollten immer aufgerufen werden, unabhängig vom vorherigen Fehler erster zurückgegebener Fehlercode ungleich Null soll verbreitet werden, dh
Das Schreiben der rc, rc_ Multiplexing ist ermüdend und fehleranfällig (egal ob ein ternärer Operator, ob / sonst oder etwas anderes verwendet wird).
Sei es eine Fehler propagierende Hilfsfunktion
%Vor% Dies könnte in foobar
wie folgt verwendet werden
Erlaubt der C-Standard die Optimierung, indem die Auswertung des ersten Parameters von rc_propagate
, einer statischen Inline-Funktion, in das Ternär gezogen wird, damit er aufgrund der ternären Operator-Bewertungsregeln nicht ausgeführt wird, wenn der zweite Parameter p
waren ungleich Null?
Ein Compiler (oder Hardware) kann das Programm 1 optimieren, solange das Programm gleich bleibt, dh Sie können nicht beweisen, dass das Programm, das ausgeführt wurde, anders als das Programm war du hast geschrieben.
In diesem Fall ruft das Programm, das Sie geschrieben haben, immer die externe Funktion auf, weil es im ternären Operator nicht vorhanden ist, wo es nicht ausgewertet werden kann. Die Funktion kann verschiedene interessante Nebenwirkungen haben und ist dem Compiler unbekannt. Dies bedeutet, dass die optimierte Version des Programms die externe Funktion irgendwann aufrufen muss (der Code kann neu geordnet werden), um dieses Verhalten beizubehalten.
Wenn das nicht stimmt, könnten Sie beweisen, dass das Programm, das ausgeführt wurde, nicht mit dem Programm übereinstimmt, das Sie geschrieben haben. Dies zu tun wäre einfach; Setzen Sie eine printf (oder eine äquivalente) Anweisung in den externen Funktionsaufruf.
1. Ein Konzept eines abstrakten Programms, das bei der Ausführung vorhanden ist, nicht der generierte Maschinencode oder die ausführbare Datei.
Mit einem Argument aus der Autorität können Sie sehen, dass kein Compiler die Aufrufe von foo () und bar () out optimiert:
gcc-Versionen 4.9.2, 5.3 oder 6.1 mit -O2:
%Vor%kling Versionen 3.7.1, oder 3.8 mit -O2:
%Vor%Tags und Links optimization c language-lawyer