Хотя у компилятора есть много возможностей, особенно с кодом, который, как доказывается, не дает никаких наблюдаемых эффектов, стандарт C действительно указывает, что время жизни автоматической переменной (локальной переменной) начинается при входе в блок вкоторый объявляется (это тело foo
в случае, о котором вы спрашиваете.) [Примечание 1]
До тех пор, пока объявление не будет достигнуто во время выполнения foo
- если оно достигнуто -- переменная имеет неопределенное значение, что ограничивает ее использование.Кроме того, имя переменной не отображается до ее объявления.Тем не менее, переменная существует (если она не была исключена, поскольку компилятор определил, что она не имеет значения).
В целом об этом не стоит беспокоиться.«Выделение» автоматической переменной обычно состоит в уменьшении указателя стека при входе в функцию;это делается только один раз путем суммирования размера всех автоматических переменных функции.Компьютеры не ограничиваются подсчетом пальцев;они могут вычесть большое число из указателя стека за то же время, что и для вычитания небольшого числа.Единственный раз, когда вы можете заметить этот эффект, если ваша функция имеет мегабайты локальных переменных.Вам следует избегать этого.
Примечания:
- Массивы переменной длины являются исключением из этого правила, поскольку они не могут быть распределены, пока не известен их размер, который не можетбыть определенным, пока декларация не будет фактически оценена.