gcc C / C ++ keine Zeiger Aliasing annehmen

8

Nachdem ich kürzlich gelesen habe, dass der Hauptgrund, warum fortran in numerischen Berechnungen schneller als c / c ++ ist, der Grund dafür ist, dass kein Zeiger-Aliasing vorhanden ist.

Offensichtlich erlaubt die Verwendung von restrict oder __restrict__ keywords von Fall zu Fall das Fehlen von Zeiger-Aliasing für ein bestimmtes Speicherelement anzugeben.

Der icc-Compiler hat anscheinend eine Option -fno-alias , die es einem erlaubt global anzunehmen, dass kein Aliasing vorhanden ist. Auf gcc gibt es -fno-strict-aliasing , was nur für eine Teilmenge aller Aliasing-Situationen gilt.

Gibt es in gcc eine Option oder gibt es Fälle, in denen bei Verwendung bestimmter Optimierungs-Flags kein Aliasing angenommen wird?

    
vkubicki 04.09.2011, 10:21
quelle

1 Antwort

14

GCC hat die Option -fstrict-aliasing , die Aliasing-Optimierungen global aktiviert und Sie erwartet, um sicherzustellen, dass nichts illegal aliasiert wird. Diese Optimierung ist für -O2 und -O3 möglich. Ich glaube.

C ++ hat jedoch gut definierte Aliasing-Regeln, und standardkonformer Code steht nicht im Konflikt mit strengem Aliasing. Das bedeutet insbesondere, dass Sie nicht über einen Zeiger auf einen anderen Typ auf eine Variable zugreifen dürfen:

%Vor%

Die entscheidende Ausnahme von dieser Regel besteht darin, dass Sie immer auf eine beliebige Variable über einen Zeiger auf char zugreifen können. (Dies ist für die Serialisierung über IO-Operationen erforderlich.)

Die Aliasregeln helfen dem Compiler nicht zu wissen, ob sich Zeiger desselben Typs gegenseitig aliasieren. Bedenken Sie Folgendes:

%Vor%

Hier kann der Compiler nicht wissen, ob c auf anderen Speicher zeigt als a oder b und muss vorsichtig sein. Ich denke, das ist, wo restrict einen Unterschied macht, im Wesentlichen, indem wir versprechen, dass float * restrict c bedeutet, dass niemand Aliase c .

    
Kerrek SB 04.09.2011, 10:32
quelle

Tags und Links