В общем случае не гарантируется, что или local
или local2
выделены, по крайней мере, в том смысле, что им дано место в памяти. Компиляторы часто используют регистры ЦП для хранения локальных переменных, а компиляторы присваивают регистру переменные только тогда, когда
- им присвоено значение
- код использует их каким-то образом
Неиспользуемые переменные часто полностью исключаются, и компилятор не создает никакой соответствующей им сборки.
Единственное исключение из этого, если у конструктора переменной есть какой-то побочный эффект, который может быть видимым (например, если он открывает файл или печатает что-то при его создании).
При этом вы можете условно убедиться, что компилятор не создаст никакой сборки, соответствующей local2
, даже в режиме отладки , с помощью оператора if constexpr
(introducd в C ++ 17): * 1 021 *
template<bool _CalcExtra>
int foo()
{
int local;
if constexpr(_CalcExtra) {
int local2;
for(...)
{
... work using local
... additional work using local and local2
}
return local2;
} else {
for(...)
{
... work using local
}
return local;
}
}