Das Schlüsselwort restrict in C

Abdul Mateen 12 Oktober 2023
  1. Compileroptimierung in C
  2. das Schlüsselwort restrict in C
  3. das Schlüsselwort restrict in C++
  4. Abschluss
Das Schlüsselwort restrict in C

Dieses Tutorial behandelt das Schlüsselwort restrict in C und seine Verwendung für Compiler-Optimierungen. Daher werden wir zuerst die Compiler-Optimierung besprechen.

Als nächstes besprechen wir das Schlüsselwort restrict in C anhand eines Codebeispiels. Abschließend kommen wir zum Schluss, nachdem wir kurz das Schlüsselwort restrict in C besprochen haben.

Compileroptimierung in C

Ein wichtiges Merkmal eines Compilers sind seine Optimierungswerkzeuge. Im Allgemeinen wird erwogen und gelehrt, dass ein Compiler ein Hochsprachenprogramm in ein Programm auf Maschinenebene übersetzt.

Moderne Compiler führen jedoch auch eine Codeoptimierung durch.

Die Codeoptimierung minimiert die Ausführungszeit, die Speichernutzung und den Stromverbrauch. Diese Aktion hat eine Analogie zu einem intelligenten Übersetzer, der nicht nur übersetzt, sondern Sätze modifiziert, um sie besser zu machen.

Die Compileroptimierung ist ein sehr ausgeklügelter Prozess, der aus Optimierungstransformationen besteht, um einen äquivalenten Code zu erzeugen, der die gleiche Ausgabe erzeugt, aber nur minimale Ressourcen verbraucht: hauptsächlich Zeit und Speicherplatz.

Hier sehen wir ein Beispiel, um die Compiler-Optimierung und ihre Nützlichkeit zu verstehen. Stellen Sie sich ein sehr einfaches Programm vor:

#include <stdio.h>
int main() {
  int i;
  for (i = 1; i <= 10; i++) printf("%d ", i);
  return 0;
}

Ausgang:

1 2 3 4 5 6 7 8 9 10

Dies ist ein sehr einfaches Programm; Das Programm führt jedoch neben dem Drucken der Zählung von eins bis zehn einige zusätzliche Schritte aus. Die Vergleichs- und Inkrementierungsschritte werden mindestens zehnmal durchgeführt; vielmehr werden die Vergleiche elf Mal durchgeführt (d. h. 10 Mal true und false für die 11. Iteration).

Insgesamt verbrauchen wir zweiunddreißig Anweisungen, um diese Zählung zu drucken. Die erste Anweisung ist die Initialisierung.

Elf Vergleichsaussagen. Zehn Inkrementanweisungen und zehn Druckanweisungen.

Der Compiler kann die im obigen Code beteiligten Konstanten leicht beurteilen und einen äquivalenten Code generieren, etwa wie den folgenden Code.

#include <stdio.h>

int main() {
  printf("%d ", 1);
  printf("%d ", 2);
  printf("%d ", 3);
  printf("%d ", 4);
  printf("%d ", 5);
  printf("%d ", 6);
  printf("%d ", 7);
  printf("%d ", 8);
  printf("%d ", 9);
  printf("%d ", 10);
  return 0;
}

Der obige Code hat die gleiche Ausgabe wie der vorherige Code. Sogar eine einzige print-Anweisung kann die gleiche Ausgabe erzeugen.

Dies ist nur ein einfaches Beispiel; Moderne Compiler führen jedoch viele ausgeklügelte Optimierungen durch, um so viele Ressourcen wie möglich zu minimieren.

das Schlüsselwort restrict in C

Die C99-Standards führen das Schlüsselwort restrict ein. Dieses Schlüsselwort wird bei der Deklaration von Zeigern als Typqualifizierer verwendet.

Es fügt keine neue Funktionalität hinzu; Es wird jedoch nur verwendet, um den Compiler zu informieren, bestimmte Optimierungen vorzunehmen.

Dieses Schlüsselwort wird mit einem Zeiger verwendet, um den Compiler darüber zu informieren, dass dies der einzige Zeiger ist, der die Variable/den Speicher verwendet, und dass kein anderer Zeiger auf denselben Speicher zugreift.

Dies scheint eine nutzlose Information zu sein; dieser Compiler wird jedoch darüber informiert, dass kein anderer Zeiger auf denselben Speicher zugreift. Daher besteht keine Notwendigkeit, zusätzliche Überprüfungen für das Laden/Entladen von Speicher anzuwenden.

die Keyword-Syntax restrict

Das Schlüsselwort restrict wird mit einer Zeigerdeklaration nach * und vor dem Variablennamen hinzugefügt.

int* restrict x;

Offensichtlich hat dieses Schlüsselwort keinen Einfluss auf die Funktionalität des Codes. Daher geben wir ein Beispiel, um zu beschreiben, wie wir das Schlüsselwort restrict in unserem Code verwenden können.

#include <stdio.h>

void f1(int *a, int *restrict b) { printf("%d %d\n", *a, *b); }
int main() {
  int x = 100, y = 200;
  f1(&x, &y);
  return 0;
}

In diesem Code wird das Schlüsselwort restrict als Qualifier mit dem zweiten Parameter in der Funktion f1 hinzugefügt.

Dieses Schlüsselwort teilt dem Compiler mit, dass der Speicher, auf den dieser Zeiger zugreift, exklusiv ist und kein anderer Zeiger auf denselben Speicher zugreift; Daher kann der Compiler die Optimierung durchführen, indem er den Assemblercode einfach hält.

Ausgang:

100 200

Auch hier bleibt die Ausgabe gleich, auch wenn wir das Schlüsselwort restrict entfernen.

das Schlüsselwort restrict in C++

Es ist auch wichtig zu beachten, dass C++ überraschenderweise die Verwendung des Schlüsselworts restrict nicht zulässt.

Sie können das googeln; Dies bedeutet jedoch nicht, dass C++ diese Funktion nicht unterstützt. C++ hat diese Funktion implizit, und die Compiler haben eine automatische Möglichkeit, diese Art von Einschränkung zu erkennen, und die Optimierung wird entsprechend durchgeführt.

Abschluss

Die Compiler fügen einige Codeoptimierungen hinzu, um ihn ressourcenoptimiert zu machen. Das restrict ist ein Flag für den Compiler, um ihm zu helfen, bessere Optimierungsentscheidungen zu treffen.

Das Schlüsselwort restrict wurde in der C-Sprache vor C99 nicht unterstützt. Dieses Schlüsselwort fügt keine Funktionalität hinzu; vielmehr informiert es den Compiler, dass dieser Speicherzugriff exklusiv und eingeschränkt ist; Daher führt der Compiler die erforderliche Optimierung im übersetzten Zielassemblycode durch.

Es gibt keinen Unterschied in der Funktionalität des Codes mit oder ohne das Schlüsselwort restrict. Schließlich bietet C++ keine explizite Unterstützung für dieses Schlüsselwort.