auto y register son especificadores de almacenamiento de variables en C.
auto históricamente se refiere a una variable automática con un ámbito de visibilidad en una función/bloque. Por defecto, todas las variables locales son auto, por lo que generalmente no tiene sentido escribirlo de manera explícita.
register le pide al compilador que almacene la variable en el registro del procesador para acelerar el acceso. Pero los compiladores modernos optimizan el almacenamiento por sí mismos, ignorando o reaccionando mínimamente a ese deseo.
Además, las variables de tipo register no pueden tener dirección (&var está prohibido).
Ejemplo:
register int counter = 0; auto float sum = 0.0f;
¿Se puede declarar un puntero a una variable de tipo register? Por ejemplo:
register int x = 5; int *p = &x;
No, no se puede obtener la dirección de una variable register; esto provocará un error de compilación. El especificador register prohíbe la operación de obtención de la dirección de la variable.
Historia
En un proyecto antiguo, un desarrollador usó register para las variables del ciclo y luego intentó pasar su dirección a una función: foo(&i);. El código no compilaba, exigiendo eliminar el especificador register. El error se descubrió solo durante la compilación, retrasando la refactorización.
Historia
El equipo intentó utilizar register para una variable de gran tamaño (por ejemplo, una estructura). El compilador ignoró el deseo y almacenó la variable en la memoria, lo que no proporcionó el aumento de rendimiento esperado, y los desarrolladores buscaron durante mucho tiempo la razón de la desaceleración.
Historia
En el código, se aplicaba masivamente auto a las variables locales, considerando que era un buen estilo (basándose en otros lenguajes). Esto ensuciaba el código, no afectaba el comportamiento, complicaba la lectura y generaba preguntas entre los colegas.