Как переменная и ее ссылка хранятся и доступны в памяти компьютера? - PullRequest
0 голосов
/ 24 декабря 2018

Как переменная хранится в памяти компьютера?

Например: когда мы указываем

int x = 15;

Обычно компьютер в своей оперативной памяти выделяет4-байтовый фрагмент памяти, сохраняющий значение 15 в виде 0 и 1 в выделенных 4 байтах, а x относится к адресу 4-байтовой выделенной памяти.

Теперь я сомневаюсь, как x относится кместо в памяти.Где и как хранится ссылка?

Когда мы используем x, как он знает, для ссылки на эту область памяти.

Отличается ли это для разных языков, таких как java и python?

Отличается ли это для разных типов данных?

Я буду рад, если вы сможете сделать видео или блог, чтобы прояснить это.

1 Ответ

0 голосов
/ 24 декабря 2018

Обычно компьютер в своем оперативной памяти выделяет 4 байта ...

Все предложение полностью верно.Только существуют разные типы распределения.Самым простым является то, что в определенный момент у компьютера есть объем свободной и непрерывной памяти.Когда программа запускается, вся эта (свободная и непрерывная) память отводится новой программе.Программа полностью ответственна за управление памятью и за то, чтобы не писать вне этой зоны памяти.Вот как работает DOS (реальный режим) - очень просто.Программа (ну и время ее выполнения) информируется только о начальных и конечных адресах зоны памяти.Он «отображает» некоторый «базовый» регистр в этом оперативной памяти, так что, например, адрес 0 относится к начальному адресу, где, возможно, программа знает, что переменная X находится.Более продвинутые операционные системы выходят за рамки, например, с механизмами, блокирующими программу, пытающуюся читать или писать за пределами разрешенного ОЗУ.Даже за ее пределами более сложные ОС могут изначально дать программе немного оперативной памяти, а затем - больше оперативной памяти, когда программа ее запрашивает.

Теперь я сомневаюсь, как х относится к месту в памяти.Где и как хранится ссылка?

Обычно ссылка вообще не сохраняется в (скомпилированной) программе.То, что вы (программист) называете «X», для программы просто становится адресом.Адрес первой переменной 0, адрес второй переменной 4 и т. Д.Символы отладки, если они не удалены, отслеживают имена «высокого уровня», присвоенные адресам;но они используются отладчиками и технически не являются частью «программы».

Когда мы используем x, как он знает, ссылается на эту область памяти.

Давайтенапишите простую программу на C:

int x = 15;
int y = 20;
int s;

s = x+y;

Компилятор видит "int x" и присваивает x адрес 0. Затем видит "int y" и назначает ему адрес 4. Затем адрес 8 равен "s".Конечно, эти адреса запоминаются на протяжении всего процесса компиляции.Между тем он видит эти "x = 15" и "y = 20", и поэтому выводит эти инструкции:

"store an integer of 4 bytes, value 15, at address 0"  
"store an integer ..., 20, at address 4"

В конце он видит "s = x + y" и выводит это:

"take in the left hand the int (4 bytes) value at address 0"
"take in the right hand the int value at address 4"
"poor the left hand in the right hand"
"poor the right hand in 4 bytes at address 8"

Как видите, больше нет xy или s, только адреса (это очень упрощенное объяснение).

Отличается ли это для разных языков, таких как java и python?

Да, но не слишком много.Имя переменной всегда ссылается на адрес.Чистые интерпретируемые языки должны отслеживать имя, потому что нет разделения между компиляцией и выполнением, а промежуточные языки, такие как java (я говорю на полпути, потому что java является и компилятором, и интерпретатором), могут делать даже более сложные вещи.

Отличается ли это для разных типов данных?

Для простых типов нет.В языке Си, если мы не учитываем указатели и кучу, все переменные обрабатываются одинаково, только их длина изменяется.Длина int может быть 4 байта, символ - вероятно один байт, длина массива указана программистом, но переменные всегда ссылаются на первое местоположение буфера, содержащего значение.Компилятор сохраняет для каждой переменной свой адрес, тип, длину, чтобы он мог знать, что делать (какие инструкции компилировать), когда встречает имена переменных в источнике.


Правка для "Можете ли вы сказать мне, как именно часть" x становится 0 "происходит в компьютере во время компиляции"

Это очень просто в концепции.Компилятор читает текст источника.Каждый раз, когда он встречает объявление переменной, он присваивает ему первый свободный адрес, а затем увеличивает его на размер переменной.В начале этот адрес равен 0. После того, как компилятор читает «int x;», адрес x становится 0, а «текущий» адрес увеличивается (для int, вероятно, 4 или 8).Имена переменных, их тип и их адреса сохраняются и образуют справочную таблицу .Эта таблица используется для проверки того, что вы не объявляете идентификатор дважды, а также для того, чтобы знать, где читать и писать, когда источник ссылается на уже объявленную переменную.Если источник ссылается на необъявленную переменную, компилятор жалуется, потому что он не находит переменную в таблице поиска.Обратите внимание: вы разместили ссылку на видео, в котором говорится об указателях;указатели также являются переменными, но они вводят другие понятия.То, что я сказал об адресах, относится и к указателям, в том смысле, что они просто переменные, но их значение используется по-другому - и я не понимаю, почему вы на них настаиваете.

...