У меня есть вопрос о неопределенной переменной и демонстрируемой отрезала кода внизу:Неопределенная переменная и оптимизация компилятора
func_1()
После --- он будет толкать A
в стек и установить значение этой памяти в 40 а затем вытащите A
из стека.
После func_2()
--- он будет толкать A
в стек снова и наследуют его значение до и распечатывают значение будет 40.
void func_1()
{ int A = 40;}
void func_2()
{ int A; printf("%d/n",A);}
void main (void)
{
func_1();
func_2();
}
Если изменить имя A
в func_2()
в B
к проверить использование стека и поместить дополнительный код в нем, чтобы проверить использование пула названных переменных:
int A; printf("%d\n", A);
на моем компьютере, он говорит B
40, A
is 0.
Что мне было интересно, если у компилятора есть пул с именованными переменными, которые он повторно использует, чтобы помочь ему оптимизировать скомпилированный код (?), То почему я получил 0 на A
? Когда компилятор использует пул?
Мой вопрос основан на слайде: http://www.slideshare.net/olvemaudal/deep-c/131-I_am_now_going_to
Звучит так, как будто он сильно зависит от компилятора.Но если я правильно понимаю, в 'func_2' вы печатаете' B', а затем 'A', что означает, что, поскольку вы сначала выделяете' B', это займет значение последней вещи, которая была в стеке ('A 'from' func_1'), а следующее распределение (' A' из 'func_2') будет следующим байтом после этого. – Iluvatar
Изменение имени от A до B не сопровождает ничего, не говоря уже о «проверке использования стека». Нет такой вещи, как «пул именованных переменных». Неясно, что вы спрашиваете. – EJP
Без конкретной архитектуры недопустимо считать стек или любую другую конкретную модель памяти для автоматических переменных. И что вы подразумеваете под «пулом»? Это не имеет смысла в этом контексте. Имена (соответственно идентификаторы) находятся в таблице символов вместе с другими свойствами объектов, которые они идентифицируют. – Olaf