В каких случаях будет создаваться b в стеке?
Обычно все три, поскольку b
является автоматической переменной. В некоторых случаях компилятор может хранить b
в регистре процессора , но вы не можете заставить это произойти, это выбор компилятора.
Как уровень оптимизации компилятора влияет на это поведение?
Зависит от компилятора.
Поскольку вы предполагаете, что вы что-то делаете (полезно) с b
, это, вероятно, не будет оптимизировано. Если это произойдет, что зависит от компилятора и от того, что именно вы делаете с b
, тогда b
вообще не будет создан в стеке.
Есть ли один вариант, который предпочтительнее?
Создайте переменную b
как можно ближе к ее использованию, в верхней части блока, где это необходимо.
Я бы выбрал g()
, так как это самая лаконичная функция (для достижения той же цели используется минимальное количество символов в отличие от других). Более того, он создает b
непосредственно перед его использованием.
PS: Конечно, g()
может использовать только один return
, но вы поймете идею.