Когда я использую переменную (например, х), как машина знает адрес этой переменной - PullRequest
0 голосов
/ 24 января 2020

Когда я объявляю такую ​​переменную

Int x = 10

Значение 10 будет назначено по определенному адресу (например, 0x00001) в основной памяти, и когда я использую x, компилятор будет использовать значение, которое сохранено в адресе (0x00001) И мой вопрос здесь Когда я использую переменную x, как процессор знает адрес x, что означает, как CPU знает, что переменная x имеет значение в адресе (0x00001)

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Значение 10 будет присвоено определенному адресу

Не обязательно. В зависимости от случая, он может никогда не существовать в адресе памяти, а только в регистре процессора, например. Но давайте пока предположим, что он хранится в памяти.

как CPU знает адрес x

CPU не знает x. Компилятор генерирует инструкцию, которая сообщает ЦПУ загрузить или сохранить значение с адреса памяти 0x00001 или по адресу. Компилятор - это то, что выбрал адрес, поэтому компилятор знает, какой адрес он выбрал. Это абстрактный взгляд на то, что происходит. Это немного сложнее в реальности.

2 голосов
/ 24 января 2020

Когда я объявляю такую ​​переменную Int x = 10

Правильный синтаксис в стандарте C ++ будет int x = 10;

Значение 10 будет назначаться по определенному адресу (например, 0x00001) в основной памяти

Значение 10 будет записано в ячейку памяти в стеке, да.

и когда я use x компилятор будет использовать значение, сохраненное в адресе (0x00001)

Компилятор не запускает ваш код, он компилирует его из исходного кода C ++ в исполняемый машинный код. Переменная x существует только в вашем исходном коде. * Когда ваша программа скомпилирована, компилятор заменит все ссылки на x адресом памяти, например, 0x00001. Конечный исполняемый файл будет только работать в терминах адресов памяти. Таким образом, определение int x = 10; станет машинным кодом, похожим на mov 10, 0x00001. Реально, x будет определяться не как абсолютная область памяти, а как смещение от базы текущего кадра стека.

И мой вопрос здесь Когда я использую переменную x, как процессор знать адрес x Это означает, что процессор знает, что переменная x имеет значение в адресе (0x00001)

Процессор понятия не имеет, что такое «переменная», и, конечно, понятия не имеет что ячейка памяти 0x00001 была названа x до компиляции программы. Все, что ЦП когда-либо видит, - это адреса памяти.


* Компиляторы могут вставлять в исполняемые файлы дополнительную информацию, такую ​​как имена переменных (именно так работают отладчики C ++), но это не связано с тем, как ЦП выполняет программу в обычном режиме. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...