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?
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
.