auto und register sind Speicheroperatorden für Variablen in C.
auto bezeichnet historisch eine automatische Variable mit Sichtbarkeit innerhalb einer Funktion/Block. Standardmäßig sind alle lokalen Variablen auto, daher macht es normalerweise keinen Sinn, dies explizit zu schreiben.
register fordert den Compiler auf, die Variable im CPU-Register zu speichern, um den Zugriff zu beschleunigen. Moderne Compiler optimieren jedoch das Speichern selbst und ignorieren oder reagieren minimal auf dieses Anliegen.
Außerdem können register-Variablen keine Adressen haben (&var ist verboten).
Beispiel:
register int counter = 0; auto float sum = 0.0f;
Kann ein Zeiger auf eine register-Variable deklariert werden? Zum Beispiel:
register int x = 5; int *p = &x;
Nein, die Adresse einer register-Variable kann nicht erhalten werden – das wird zu einem Kompilierungsfehler führen. Der Speicheroperator register verbietet das Adressnehmen einer Variablen.
Geschichte
In einem alten Projekt verwendete ein Entwickler register für Schleifenvariablen und versuchte dann, ihre Adresse an eine Funktion zu übergeben: foo(&i);. Der Code kompilierte nicht und erforderte das Entfernen des Speicheroperators register. Der Fehler wurde erst während der Erstellung entdeckt, was die Refactoring verzögerte.
Geschichte
Das Team versuchte, register für eine Variable großer Größe (z. B. eine Struktur) zu verwenden. Der Compiler ignorierte den Wunsch und speicherte die Variable im Speicher, was nicht die erwartete Leistungssteigerung brachte und die Entwickler lange nach dem Grund für die Verlangsamung suchten.
Geschichte
Im Code wurde auto massenhaft für lokale Variablen verwendet, was als guter Stil angesehen wurde (basierend auf anderen Sprachen). Dies verschmutzte den Code, hatte keinen Einfluss auf das Verhalten, erschwerte das Lesen und warf Fragen bei den Kollegen auf.