TL; DR: Ваши примеры объявляют и инициализируют автоматическую переменную.Он должен быть инициализирован каждый раз, когда вызывается функция.Таким образом, будет некоторая инструкция, чтобы сделать это.
Как скорректированный дубликат моего ответа на Как во время компиляции внутренняя инициализация переменных работает в c? :
Стандарт не определяет точный способ инициализации.Это зависит от среды, в которой разрабатывается и выполняется ваш код.
Способ инициализации переменных зависит также от продолжительности их хранения.Вы не упомянули об этом в тексте, ваш пример - автоматическая переменная.(Скорее всего, это оптимизировано, как указывают комментаторы.)
Инициализированные автоматические переменные будут записываться при каждом достижении их объявления.Скомпилированная программа выполняет некоторый машинный код для этого.
Статические переменные всегда инициализируются и только один раз перед запуском программы.
Примеры из реального мира:
Большинство (если не все) компьютерные системы хранят начальные значения явно (а не нулевых) инициализированных статических переменных в специальном разделе data
, который загружается загрузчиком системы в ОЗУ.Таким образом, эти переменные получают свои значения до запуска программы.Статические переменные, не инициализированные явно или имеющие нулевые значения, помещаются в секцию bss
и заполняются нулями кодом запуска перед запуском программы.
Многие встроенные системы имеют свою программу в энергонезависимой памяти, котораяне может быть измененоВ таких системах код запуска копирует начальные значения раздела data
в выделенное ему пространство в ОЗУ, что приводит к аналогичному результату.Тот же код запуска обнуляет также раздел bss
.
Примечание 1: разделы не обязательно должны называться так.Но это часто встречается.
Этот код запуска может быть частью скомпилированной программы или нет.Это зависит, см. Выше.Но говоря об эффективности, не имеет значения, какая программа инициализирует переменные.Это просто нужно сделать.
Примечание 2: Существуют другие виды продолжительности хранения, см. Главу 6.2.4 стандарта.
ПокаСтандарт соблюдается, система может свободно выполнять любые другие виды инициализации, включая пошаговое запись начальных значений в их переменные.