2012-01-19 4 views
6

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

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

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

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

+0

Если я правильно помню, ответ на это немного нелогичен. Я позволю кому-то умнее сделать объяснение только потому, что моя память слишком туманна по этому вопросу. – Esko

+0

Очень заманчиво ошибочно утверждать, что int [] получает больше, чем больше чисел. У некоторых людей нет модели того, как работает компьютер? – Ingo

+0

@Ingo Я думал, что оптимизация может быть выполнена, если бы они были одинаковыми значениями (т.е. 0) – Pacerier

ответ

7

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

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

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

1

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

1

У вас не может быть ArrayList<int> или любого другого класса контейнеров с примитивами. Что касается простых массивов, см. Jon Skeets.

+1

Я уверен, что он это знает и хочет создать свой собственный не-общий класс ArrayList, например 'IntArrayList'. –

+0

+ Санджай - Я не уверен. Во всяком случае, я не должен отвечать на вопрос, что мог сказать кто-то, но отвечать на то, что он просил. – Ingo

+1

Я прочитал его, когда он реализует свой собственный список массивов (не используя ArrayList). – wmorrison365

1

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

2

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

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

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

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

+1

Это * необходимо *, если вы используете тип ArrayList. Если я добавлю элемент, а затем удалю этот элемент из списка, я не хочу, чтобы эта ссылка не висела в списке без причины. –

+0

Если вы управляете своей собственной памятью, вам нужно управлять сбрасыванием объектов, которые не используются. Если нет, то GC берет его, если дальнейших ссылок на этот объект нет (в какое-то неопределенное время). – wmorrison365

+1

@JonSkeet Да, это, вероятно, хорошая идея, если вы реализуете свой собственный «Список». Многие люди считают, что настройка переменных на «нуль» в целом - хорошая идея (не понимая, почему именно). На мой взгляд, вы не должны делать ничего, потому что у вас есть смутное представление о том, что оно «хорошо» - только сделайте это, если вы поймете, почему. – Jesper

1

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

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

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