Frage Leistungsvorteile durch striktes Aliasing


In C: Was genau sind die Leistungsvorteile, die mit der Einhaltung des strengen Aliasing einhergehen?


16
2018-04-16 06:11


Ursprung


Antworten:


Es gibt eine Seite, die Aliasing sehr gründlich beschreibt Hier.

Es gibt auch einige SO-Themen Hier und Hier.

Zusammenfassend kann der Compiler den Wert von Daten nicht annehmen, wenn zwei Zeiger unterschiedlicher Typen auf denselben Ort zugreifen (d. H. Er muss den Wert jedes Mal lesen und kann daher keine Optimierungen vornehmen).

Dies tritt nur auf, wenn strenges Aliasing nicht erzwungen wird. Strenge Aliasing-Optionen:

  • gcc: -fstrict-aliasing [Standard] und -Fno-strict-Aliasing
  • msvc: Strict Aliasing ist standardmäßig deaktiviert. (Wenn jemand weiß, wie man es anstellt, Bitte sag es.)

Beispiel

Kopieren Sie diesen Code in main.c:

void f(unsigned u)
{
    unsigned short* const bad = (unsigned short*)&u;
} 

int main(void)
{
    f(5);

    return 0;
}

Dann kompiliere den Code mit diesen Optionen:

gcc main.c -Wall -O2

Und du wirst bekommen:

main.c: 3:   Warnung: Dereferenzierung type-punned   Der Zeiger bricht das strikte Aliasing   Regeln

Deaktivieren Sie das Aliasing mit:

gcc main.c -fno-strict-aliasing   -Wall -O2

Und die Warnung verschwindet. (Oder nehmen Sie einfach -Wall aber ... kompilieren Sie nicht ohne es)

Versuchen Sie, wie ich könnte MSVC nicht bekommen, um mich zu warnen.


19
2018-04-16 06:32