auto et register sont des spécificateurs de stockage pour les variables en C.
auto signifie historiquement une variable automatique avec une portée dans une fonction/bloc. Par défaut, toutes les variables locales sont auto, donc il n'est généralement pas nécessaire de l'écrire explicitement.
register demande au compilateur de stocker la variable dans un registre du processeur pour accélérer l'accès. Cependant, les compilateurs modernes optimisent eux-mêmes le stockage, ignorant ou réagissant très peu à cette demande.
De plus, les variables de type register ne peuvent pas avoir d'adresse (&var est interdit).
Exemple :
register int counter = 0; auto float sum = 0.0f;
Peut-il y avoir un pointeur sur une variable register ? Par exemple :
register int x = 5; int *p = &x;
Non, il n'est pas possible d'obtenir l'adresse d'une variable register — cela entraînera une erreur de compilation. Le spécificateur register interdit l'opération de prise d'adresse d'une variable.
Histoire
Dans un ancien projet, un développeur a utilisé register pour les variables de boucle, puis a tenté de passer leur adresse à une fonction : foo(&i);. Le code ne compilait pas, exigeant de retirer le spécificateur register. L'erreur n'a été découverte qu'au moment de l'assemblage, ce qui a retardé le refactoring.
Histoire
L'équipe a tenté d'utiliser register pour une variable de grande taille (par exemple, une structure). Le compilateur a ignoré la demande et a stocké la variable en mémoire, ce qui n'a pas donné l'augmentation de performance attendue, et les développeurs ont longtemps cherché la cause du ralentissement.
Histoire
Dans le code, auto était massivement utilisé pour des variables locales, en considérant cela comme un bon style (en se basant sur d'autres langages). Cela a encombré le code, n'a pas influencé le comportement, a compliqué la lecture et a soulevé des questions chez les collègues.