Где в памяти "ноль" - PullRequest
       18

Где в памяти "ноль"

6 голосов
/ 15 ноября 2011

В Java вы не можете указать размер массива в его объявлении

int[5] scores;  //bad

Мне сказали, что это потому, что JVM не выделяет пространство в памяти, пока объект не инициализирован. Если у вас есть переменная массива экземпляра (автоматически инициализируется значением по умолчанию, равным нулю), указывает ли эта переменная на место в куче, указывающее на ноль?

Ответы [ 5 ]

3 голосов
/ 15 ноября 2011

Нет, потому что в JVM в этом нет необходимости.Если вы на родном языке (например, C и C ++), NULL - это указатель с нулевым значением, который указывает на базовый адрес памяти.Очевидно, что это неправильный адрес, но вы все равно можете его разыменовать, особенно в системе без защищенной памяти, например, в старой MS-DOS или в небольших для встроенных процессоров.Не то чтобы это был действительный адрес - обычно это местоположение содержит векторы прерываний, и вы не должны их трогать.И, конечно, в любой современной ОС, которая вызовет ошибку защиты.

Но в JVM ссылка на объект больше похожа на дескриптор (т. Е. Индекс в таблице), а null - это «невозможное» значение.(индекс находится за пределами домена таблицы), поэтому его нельзя разыменовать и он не занимает место в такой таблице.

3 голосов
/ 15 ноября 2011

Нулевая ссылка - это буквально нулевое значение. Операционная система не позволяет какой-либо программе получить доступ к нулевому адресу в памяти, поэтому JVM предварительно проверит и убедится, что эталонное значение не равно нулю, прежде чем разрешить вам доступ к нему. Это позволяет JVM выдавать вам приятное исключение NullPointerException, а не сбой «Программа выполнила недопустимую операцию».

Таким образом, вы можете сказать, что переменная "указывает" на недопустимое местоположение кучи. Или вы можете просто сказать, что переменная ни на что не указывает. На данный момент это просто вопрос семантики.

2 голосов
/ 15 ноября 2011

Я думаю, что этот пост ответит на ваш вопрос - Java - Требует ли пустая переменная места в памяти

В Java null - это просто значение, на которое ссылается (чтов основном ограниченный указатель) может иметь.Это означает, что ссылка ни на что не ссылается.В этом случае вы по-прежнему занимает место для ссылки.Это 4 байта в 32-битных системах или 8 байтов в 64-битных системах.Однако вы не занимаете место для класса, на который указывает ссылка, до тех пор, пока вы фактически не выделите экземпляр этого класса, на который будет указывать ссылка.

Редактировать: Что касается String, String в Javaзанимает 16 бит (2 байта) для каждого символа, плюс небольшое количество накладных расходов на ведение бухгалтерского учета, что, вероятно, недокументировано и зависит от реализации.

(не забудьте поднять ответ в ссылке, если это поможетты ушел)

1 голос
/ 15 ноября 2011

Нет ... у вас будет нулевая ссылка (0x00) в переменной объекта.

0 голосов
/ 20 декабря 2015

Я бы сказал, что "int [5] scores; // bad" не из-за выделения памяти.Обратите внимание, что когда вы объявляете что-то, вы действительно объявляете Type ReferenceName = new Type () обычно.

Обратите внимание на два примера int [] scores = new int [5];JLabel label = new JLabel ();

Типами (с левой стороны) являются int [] и JLabel, которые не имеют ничего общего с распределением памяти (кроме указателя), а новые экземпляры (с правой стороны, требующие выделения памяти) int [5], требующие места для 5-ти дюймов, и JLabel (), не требующие аргументов для вызова конструктора, но памяти достаточно для JLabel.

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