Требуют ли больше памяти массивы «ненулевых» примитивов? - PullRequest
6 голосов
/ 19 января 2012

Привет всем, когда пишете реализацию списка массивов, я понимаю, что для Item(x) важно установить значение NULL при его удалении (вместо простого quantity -= 1), чтобы предотвратить утечки памяти.

Однако, если мой список массивов представляет собой примитивный список массивов int (поддерживаемый int[]), имеет ли смысл установить его равным 0?

Similary, для списка массивов примитивных символов (поддерживаемых char[]), когда вызывается RemoveRange (), имеет ли смысл заполнить этот диапазон \u0000?Или вполне нормально просто обновить length и указатели без изменения резервного массива?

Не заполнен ли массив целых чисел возможно меньшим объемом памяти, чем массив равной длинызаполнены целочисленными значениями, потому что среда выполнения может выполнять оптимизаций ?

Ответы [ 6 ]

7 голосов
/ 19 января 2012

Может ли массив целых чисел, заполненных нулями, занимать меньше памяти, чем массив равной длины, заполненный целочисленными значениями?

Предполагая, что в обоих случаях мы имеем дело с int[] - нет. Два массива одного типа и одинаковой длины всегда будут занимать один и тот же объем памяти.

Нет необходимости перезаписывать ваши "теперь пустые" элементы массива на 0. Это не принесет никакого вреда (кроме небольшого выигрыша в производительности), и может даже упростить вещи при отладке, но вы не нужно.

2 голосов
/ 19 января 2012

... при написании реализации списка массивов, насколько я понимаю, важно установить Item(x) на null при его удалении (вместо простого quantity -= 1), чтобы предотвратить утечки памяти.

Это не правда.Установка переменных на null - это не то, что всегда необходимо, и это не означает, что у вас есть утечка памяти.

Однако, если мой список массивов является примитивным списком массивов int,имеет смысл установить его в 0?

Нет, для примитивов это не имеет значения вообще, 0 или \u0000 (для символа) - это просто значение, подобное любому другому значению.Это не займет меньше места.

1 голос
/ 19 января 2012

Нет, вам нужно обнулить слот объекта в массиве, чтобы предотвратить утечку.Если объект по-прежнему ссылается на ваш массив, то он не может быть GC'd - поэтому утечка, на которую вы ссылаетесь.

Примитивы, с другой стороны, все равно размещаются в стеке, а не в куче, поэтомув любом случаеПримитивы, которые являются экземплярами классов, хранятся в виде полей соответствующего объекта и очищаются, когда объект имеет значение GC.

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

1 голос
/ 19 января 2012

Примитивы и ссылки всегда занимают одинаковое количество места.

1 голос
/ 19 января 2012

Вы не можете иметь ни ArrayList<int>, ни какой-либо другой контейнерный класс с примитивами. Относительно простых массивов см. Ответ Джона Скитса.

1 голос
/ 19 января 2012

Нет, это не обязательно делать с примитивными типами (т. Е. Устанавливать их в 0), поскольку единственная причина, по которой «слоты» явно обнуляются, состоит в том, чтобы предотвратить фальшивые ссылки на них, что приводит к сбору мусора.

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