auto en register zijn opslag-specifiers voor variabelen in C.
auto duidt historisch gezien een automatische variabele aan met een scope binnen een functie/blok. Standaard zijn alle lokale variabelen auto, dus het heeft meestal geen zin om dit expliciet te schrijven.
register vraagt de compiler om de variabele in de processor registraties op te slaan voor snellere toegang. Maar moderne compilers optimaliseren zelf de opslag en negeren of reageren minimaal op deze wens.
Daarnaast kunnen variabelen van het type register geen adres hebben (&var is niet toegestaan).
Voorbeeld:
register int counter = 0; auto float sum = 0.0f;
Kan er een pointer naar een register-variabele worden gedeclareerd? Bijvoorbeeld:
register int x = 5; int *p = &x;
Nee, je kunt het adres van een register-variabele niet krijgen – dit resulteert in een compileerfout. De register storage-specifier verbiedt de operatie om het adres van de variabele te nemen.
Verhaal
In een oud project gebruikte een ontwikkelaar register voor loopvariabelen en probeerde vervolgens hun adres door te geven aan een functie: foo(&i);. De code compileerde niet en vereiste het verwijderen van de register specifier. De fout werd pas tijdens de build ontdekt, wat de refactoring vertraagde.
Verhaal
Het team probeerde register te gebruiken voor een grote variabele (bijvoorbeeld, een structuur). De compiler negeerde de wens en slaagde de variabele in het geheugen op, wat niet de verwachte prestatieverbetering opleverde, en de ontwikkelaars zochten lang naar de oorzaak van de vertraging.
Verhaal
In de code werd massaal auto toegepast voor lokale variabelen, in de veronderstelling dat dit een goede stijl was (gebaseerd op andere talen). Dit verrommelde de code, had geen invloed op het gedrag, maakte het lezen moeilijker en roept vragen op bij collega's.