Heim > Backend-Entwicklung > C++ > Was bewirkt das C-Schlüsselwort „restrict' und wie optimiert es den Code?

Was bewirkt das C-Schlüsselwort „restrict' und wie optimiert es den Code?

Patricia Arquette
Freigeben: 2024-12-26 22:58:17
Original
753 Leute haben es durchsucht

What Does the C   `restrict` Keyword Do and How Does It Optimize Code?

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;
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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;
     }
 }
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage