Я попробовал этот код на Visual C ++ 2008, и он показывает, что A и B не имеют одинаковый адрес.
int main()
{
{
int A;
printf("%p\n", &A);
}
int B;
printf("%p\n", &B);
}
Но так как A больше не существует, когда B определен, мне кажется, что это же место в стеке может быть использовано повторно ...
Я не понимаю, почему компилятор, похоже, не выполняет то, что выглядит как очень простая оптимизация (что может иметь значение, например, в контексте больших переменных и рекурсивных функций). И не похоже, что его повторное использование будет тяжелее как для процессора, так и для памяти. У кого-нибудь есть объяснение этому?
Я полагаю, что ответ на этот вопрос "потому что это гораздо сложнее, чем кажется", но, честно говоря, я понятия не имею.
edit : некоторые уточнения относительно ответов и комментариев ниже.
Проблема с этим кодом заключается в том, что при каждом вызове этой функции стек увеличивается «на целое число слишком много». Конечно, это не проблема в примере, но рассмотрите большие переменные и рекурсивные вызовы, и у вас есть переполнение стека, которого можно легко избежать.
То, что я предлагаю, - это оптимизация памяти, но я не вижу, как это повредит производительности.
И, кстати, это происходит в сборках , все оптимизации будут включены.