Intel C ++ Compilerfehler? (Aliasing von Zeigern)

8

Ich verwende den Intel C ++ Compiler 12.0 und arbeite an einem Programm ähnlich dem folgenden, das sehr einfach und unkompliziert ist. Die while-Schleife sollte im ersten Lauf anhalten. Wenn ich jedoch den Code mit dem / O2-Flag mit dem Intel-Compiler baue, hört die While-Schleife niemals auf. Wenn ich die Optimierung deaktiviere oder visuelles C ++ verwende, wird die Schleife normal beendet. Wenn ich das pt- & gt; -Flag zu p.flag ändere, was wahrscheinlich dasselbe ist, wird die Schleife auch normal beendet. Ich denke, es hat etwas mit der Optimierung von Intel zu tun. Ist das ein Fehler im Intel-Compiler? oder habe ich hier etwas verpasst?

%Vor%

Aktualisierungen: Danke für die Antwort von allen. Ich bin verwirrt durch die Erklärung von "Zeiger Aliasing". Wenn p in den Registern ist und pt nicht darauf zugreifen kann, warum unterbricht der folgende Code die while-Schleife mit dem Intel-Compiler? Zuerst "pt- & gt; flag = 0;" sollte niemals wirksam werden, weil i = 0 ist. Zweitens, selbst wenn es in Kraft ist, sollte "Zeiger-Aliasing" nicht verhindern, dass p modifiziert wird?

Übrigens: Kann mir jemand sagen, wie man das Zeiger-Aliasing in Visual Studio mit dem Intel Compiler ein- und ausschaltet? Danke!

%Vor%     
Dan Xu 02.09.2012, 22:25
quelle

1 Antwort

6

Dies ist eine Situation, die als Zeiger-Aliasing bekannt ist. Sie haben eine Variable p und einen Zeiger pt , der auf dasselbe verweist wie p . Viele Optimierungen können verwendet werden, wenn der Compiler annehmen kann, dass es nur einen "Namen" für eine gegebene Variable gibt, und /O2 für Ihren Compiler kann diese Annahme aktivieren. Zum Beispiel könnte der Compiler alle Membervariablen für p in Registern während der Schleife behalten, auf die offensichtlich nicht durch einen Speicherzeiger zugegriffen werden kann.

Überprüfen Sie Ihre Compiler-Dokumentation, um herauszufinden, wie man nicht davon ausgehen kann, dass es keine Pointer-Aliase gibt. Dies könnte ein Compiler-Schalter oder ein #pragma sein.

    
Greg Hewgill 02.09.2012 22:30
quelle