Was bedeutet das Schlüsselwort „Restrict“ in C?
Das Schlüsselwort „Restrict“ in C (eine Syntax vor C 14, die nur gültig ist als eine GCC-Erweiterung) gibt an, dass zwei oder mehr an eine Funktion übergebene Zeiger nicht auf überlappenden Speicher verweisen Regionen.
C99-Standard
In C99 soll „restrict“ den Code optimieren, indem es Compilern ermöglicht, davon auszugehen, dass Zeiger sich nicht gegenseitig aliasen. Dies kann zu erheblichen Leistungsverbesserungen führen, indem Optimierungen wie Schleifenentrollen und Vektorisierung aktiviert werden, wie im folgenden Beispiel gezeigt:
void f(int *a, int *b, int *x) { *a += *x; *b += *x; } void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x) { *a += *x; *b += *x; }
Ohne Einschränkung sind zwei Assembleranweisungen erforderlich, um den Wert von „x“ zu laden sowohl „a“ als auch „b“, aber mit „restrict“ wird der Wert von „x“ nur einmal geladen.
GCC Optimierung
GCC kann Restrict nutzen, um Code zu optimieren, wie der folgende Assemblercode zeigt:
f: mov (%rdx),%eax add %eax,(%rdi) mov (%rdx),%eax add %eax,(%rsi) fr: mov (%rdx),%eax add %eax,(%rdi) add %eax,(%rsi)
In diesem Beispiel hat die mit Restrict optimierte „fr“-Funktion eine weniger Assembler-Anweisung als die nicht optimierte 'f'-Funktion.
Arrays
Einschränken kann sein Besonders nützlich beim Umgang mit Zeigerargumenten, die auf Arrays verweisen, sodass Compiler Vorgänge wie Memset und Memcpy optimieren und möglicherweise die Leistung verbessern können.
Array-Beispiel
void f(char *restrict p1, char *restrict p2, size_t size) { for (size_t i = 0; i < size; i++) { p1[i] = 4; p2[i] = 9; } }
Mit Beschränken, dieser Code kann optimiert werden, um Memset für mehr Effizienz zu verwenden. Das Entfernen von „Restrict“ würde diese Optimierung deaktivieren und zu falschem Verhalten führen, wenn sich die Arrays überlappen.
Strikte Aliasing-Regel
Restrict gilt aufgrund der Striktheit nur für Zeiger kompatibler Typen Aliasing-Regel. Durch die Umwandlung eines inkompatiblen Typs in einen gültigen Typ wird der Beschränkungsvertrag gebrochen, was möglicherweise zu undefiniertem Verhalten führt.
GCC-Erweiterungen
GCC ermöglicht auch die Verwendung von Beschränkung mit Referenzen und Mitgliedsfunktionen, wodurch der Umfang seiner Optimierungsmöglichkeiten erweitert wird.
Das obige ist der detaillierte Inhalt vonWas bewirkt das C-Schlüsselwort „restrict' und wie optimiert es den Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!