auto и register — спецификаторы хранения переменных в C.
auto исторически обозначает автоматическую переменную с областью видимости в функции/блоке. По умолчанию все локальные переменные — auto, поэтому писать это явно смысла обычно нет.
register просит компилятор хранить переменную в регистре процессора для ускорения доступа. Но современные компиляторы сами оптимизируют хранение, игнорируя или минимально реагируя на это пожелание.
Также переменные типа register не могут иметь адрес (&var запрещено).
Пример:
register int counter = 0; auto float sum = 0.0f;
Может ли быть объявлен указатель на register-переменную? Например:
register int x = 5; int *p = &x;
Нет, получить адрес register-переменной нельзя — это будет ошибкой компиляции. Спецификатор register запрещает операцию взятия адреса у переменной.
История
В старом проекте разработчик использовал register для переменных цикла, а затем попытался передать их адрес в функцию: foo(&i);. Код не компилировался, требуя убрать спецификатор register. Ошибка обнаружена только во время сборки, затянула рефакторинг.
История
Команда попыталась использовать register для переменной большого размера (например, структура). Компилятор проигнорировал пожелание и хранил переменную в памяти, что не дало ожидаемого прироста производительности, а разработчики долго искали причину замедления.
История
В коде массово применяли auto для локальных переменных, считая это хорошим стилем (ориентируясь на другие языки). Это засоряло код, не влияло на поведение, усложняло чтение и вызывало вопросы у коллег.