В большинстве языков программирования компилятору разрешено выбирать, когда выделять пространство для переменных. Единственное, что вам гарантировано, это то, что хранилище будет доступно, если и когда вам это нужно.
Короткий анекдот ...
Язык программирования C используется для требуют, чтобы все переменные, используемые в методе объявляются в верхней части метода. Это связано с тем, что компиляторы использовали для резервирования хранилища для всех стековых (локальных) переменных в методе, как только вы ввели этот метод. Сегодня это требование не существует частично потому, что компиляторы намного умнее.
Большинство компиляторов C-подобных языков откладывают выделение экземпляров до первого использования для оптимизированного кода. ДЕЙСТВИТЕЛЬНО сложная вещь заключается в том, что первое использование может быть не таким, как вы думаете, и это может не произойти вообще. Например, если у вас есть следующий код:
int foo(int x) {
int y = 5;
if (x > 5)
y += x;
return y;
}
Вы можете подумать, что первое использование при назначении 5 у, но компилятор может оптимизировать этот код на что-то подобное:
int foo(int x) {
if (x > 5)
return 5 + x;
return 5;
}
В этом коде y никогда не существует вообще.
TL; DR - Компилятор фактически не гарантирует выделение памяти при объявлении или использовании. Доверяйте компилятору, он (обычно) умнее всех.
Какая переменная? Локальный, экземпляр, класс? –
считают, что это локальная переменная. Разные для разных типов? –
yes, локальные примитивы vars живут в стеке, экземпляры классов (объекты) в куче (их ссылка - locals -> on stack). – PeterMmm