Существует три широких класса переменных: статические (глобальные), стек (авто) и регистр.
Переменные регистров хранятся в регистрах ЦП. Регистры - это очень быстрые запоминающие устройства размером в слово, которые интегрированы в конвейер ЦП. Они имеют свободный доступ, но их очень мало (обычно от 8 до 32 в зависимости от вашего процессора и операций, которые вы выполняете).
Переменные стека хранятся в области оперативной памяти, называемой стеком. Стек почти всегда будет находиться в кеше, поэтому переменным стека обычно требуется 1-4 цикла для доступа.
Как правило, локальные переменные могут быть либо в регистрах, либо в стеке. Не имеет значения, расположены ли они в верхней части функции или в цикле; они будут распределяться только один раз за вызов функции, и распределение в основном бесплатное. Компилятор будет помещать переменные в регистры, если это вообще возможно, но если у вас больше активных переменных, чем регистров, они не подойдут. Кроме того, если вы берете адрес переменной, он должен храниться в стеке, поскольку регистры не имеют адресов.
Глобальные и статические переменные - это разные звери. Поскольку к ним обычно не обращаются часто, они могут не находиться в кеше, поэтому для их доступа могут потребоваться сотни циклов. Кроме того, поскольку компилятор может не знать адрес глобальной переменной заранее, его, возможно, придется искать, что также является дорогостоящим.
Как уже говорили другие, не слишком переживайте по этому поводу. Это определенно полезно знать, но это не должно влиять на то, как вы пишете свои программы. Напишите код, который имеет смысл, и позвольте компилятору беспокоиться об оптимизации. Если вы начинаете разработку компилятора, , тогда , вы можете начать беспокоиться об этом. :)
Редактировать: подробнее о распределении:
Переменные регистра распределяются компилятором, поэтому затраты времени выполнения отсутствуют. Код просто поместит значение в регистр, как только оно будет получено.
Переменные стека выделяются вашей программой во время выполнения. Как правило, когда вызывается функция, первое, что она делает, - резервирует достаточно стекового пространства для всех ее локальных переменных. Таким образом, нет переменной стоимости.