Storytime!
C, как язык, является абстракцией компьютера. Он позволяет вам делать то, что делает компьютер, то есть манипулировать памятью, выполнять математические операции, печатать вещи и т. Д.
Но C - это только абстракция. И, в конечном итоге, из you извлекается язык ассемблера. Сборка - это язык, который читает процессор, и если вы используете его, вы делаете вещи с точки зрения процессора. Что делает процессор? По сути, он читает из памяти, выполняет математику и пишет в память. Процессор не просто выполняет математические операции с числами в памяти. Во-первых, вам нужно переместить число из памяти в память внутри ЦП, называемое регистр . Когда вы закончите делать с этим номером все, что вам нужно, вы можете переместить его обратно в обычную системную память. Зачем вообще использовать системную память? Количество регистров ограничено. Вы получаете только около ста байтов в современных процессорах, а старые популярные процессоры были еще более фантастически ограничены (6502 имели 3 8-битных регистра для бесплатного использования). Итак, ваша средняя математическая операция выглядит так:
load first number from memory
load second number from memory
add the two
store answer into memory
Многое из этого ... не математика. Эти операции загрузки и хранения могут занимать до половины вашего времени обработки. C, будучи абстракцией компьютеров, избавил программиста от беспокойства по поводу использования и манипулирования регистрами, а поскольку число и тип различаются для разных компьютеров, C возлагает ответственность за распределение регистров исключительно на компилятор. За одним исключением.
Когда вы объявляете переменную register
, вы говорите компилятору: «Йо, я намерен использовать эту переменную много и / или быть недолгим. На вашем месте я бы попытался сохранить ее в регистр. " Когда стандарт C говорит, что компиляторы на самом деле ничего не должны делать, это потому, что стандарт C не знает, для какого компьютера вы компилируете, и это может быть похоже на 6502 выше, где все 3 регистра необходимы просто для работы и нет запасного регистра, чтобы сохранить ваш номер. Однако, когда он говорит, что вы не можете взять адрес, это потому, что регистры не имеют адресов. Это руки процессора. Поскольку компилятору не нужно давать вам адрес, и поскольку у него вообще не может быть адреса, для компилятора теперь доступно несколько оптимизаций. Это может, скажем, сохранить номер в реестре всегда. Ему не нужно беспокоиться о том, где он хранится в памяти компьютера (кроме необходимости вернуть его обратно). Он может даже поместить его в другую переменную, передать другому процессору, изменить местоположение и т. Д.
tl; dr: Краткосрочные переменные, которые много математики. Не объявляйте слишком много сразу.