2016-05-12 3 views
7

Ich war kürzlich überrascht zu erfahren, dass die C und C++ Sprachstandards eine "strenge Aliasing" Regel haben. Im Wesentlichen verbietet die Regel, dass Variablen unterschiedlichen Typs auf denselben Speicherort verweisen.Unterstützt Visual C++ "striktes Aliasing"?

Als Beispiel:

char buffer[4] = { 0x55, 0x66, 0x77, 0x88 }; 
int32 *p = (int32*)&buffer[0]; // illegal because buffer[0] and *p are different types 

Die meisten professionellen C++ Entwickler ich die Interaktion mit nicht vertraut sind mit dieser Regel. Basierend auf meiner Forschung scheint es hauptsächlich GCC/G ++/CLANG Benutzer zu beeinflussen. Unterstützt Visual C++ das Aktivieren/Deaktivieren dieser Regel? Wenn ja, wie geht das?

Danke

+0

AFAIK MSVC verhält sich immer so, als ob Sie No-Strict-Aliasing setzen –

+3

Es ist ein Compiler mit einem 1-800 Support-Telefon Nummer. Also nein. –

+1

lol @ mit einer 1-800 Unterstützung Nummer :) – digitale

Antwort

6

"Strict Aliasing" ist eine C++ Regel Programme zu beschränken, nicht Compiler. Da die Regel verletzt ist Undefined Behavior, keine Diagnose erforderlich ein Compiler muss es in keiner Weise unterstützen.

Das heißt, Microsoft ist ein bisschen weniger aggressiv bei der Anwendung von Optimierungen. Erst letzte Woche haben sie ihren neuen Optimierer assumes no signed overflow angekündigt, etwas, das GCC schon seit einigen Jahren annimmt. Strict Aliasing wird einige Windows-Header brechen, so dass diese zuerst behoben werden müssen. (Einige Typen verhalten sich so, als enthielten sie union s, aber sie sind nicht formal als solche definiert.)

+1

Es wäre hilfreich, IMHO, wenn es eine Möglichkeit gäbe, über die Compiler versprechen könnten, Ganzzahl-Semantik zu verwenden, so dass das Ergebnis einer n-Bit-Ganzzahl Addition, Subtraktion oder Multiplikation würde sich immer wie eine Ganzzahl verhalten, die deckungsgleich mit 2ⁿ ist, aber im Falle eines Überlaufs könnte die Wahl von * welcher * Ganzzahl nichtdeterministisch sein. Code, der auf solche Verhaltenseinschränkungen zurückgreifen könnte, könnte in vielen Fällen effizienter sein als Code, der Überläufe um jeden Preis verhindern musste. – supercat

+0

@supercat: Ich bin mir nicht sicher, ob Sie wirklich Compiler-Hilfe dafür brauchen; Es klingt, als könnte man das in einer Bibliothek implementieren. Benutze 'unsigned' intern; seine Operationen entsprechen fast 1: 1 mit der vorzeichenbehafteten Zweierkomplementarithmetik. – MSalters

+1

Man könnte eine Bibliothek schreiben, um solche Berechnungen so durchzuführen, dass immer ein Ergebnis im Bereich von "int" erhalten wird, aber das Einzwingen des Wrapping-Verhaltens - ob über Code oder Compiler-Optionen - kann ein Haupthindernis für die Effizienz sein. Wenn ein Programmierer das Wrapping-Verhalten erzwingen muss, um zu verhindern, dass ein Compiler die Rails springt, verhindert das oft, dass ein Compiler so effizient Code generiert, wie er generieren könnte, wenn er die Möglichkeit hätte, Icing zu ignorieren x> y', wenn 'x' und' y' schleifeninvariant sind, könnte ein Compiler eine Schleife für den Fall verwenden, in dem 'yx' nicht überläuft ... – supercat

Verwandte Themen