Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Длинные массивы и память


Автор: Aliance 14.4.2009, 09:24
Интересует следующая вещь, если я имею массив вида:
Код

var a = [];
a[10000000] = 1;
a[999999999999] = 5;

будет ли этот код намного больше есть памяти, чем следующий:
Код

var a = [ 1, 5 ];

Автор: bars80080 14.4.2009, 09:33
имхо, да. уже не раз встречал ситуацию, когда развёртывание массива в котором были только элементы [2009] к примеру приводило к тому, что и все элементы от 0 тоже существуют

Автор: Aliance 14.4.2009, 09:55
Существуют - это одно, а вот нагружают ли они оперативку?
Один товарищ мне сказал, что нет. Фактически, это ассоциативный массив получается по его словам. Но подкрепить свои слова он не смог.

И если все же нагрузка есть - какие альтернативы?

Автор: IDVsbruck 14.4.2009, 12:28
При
Код

var a = [1, 5];

длина массива a.length будет равна 2.
А при
Код

var a = [];
a[10000000] = 1;
a[999999999999] = 5;

длина будет уже 1000000000000, при указании любого другого индекса выдаст undefined, то есть "промежуточные" элементы точно не создаются, также как для первого случая при задании a[10] выдаст тот же undefined. Думаю, это служит подтверждением, что объем в памяти этих структур не должен изменяться (по крайней мере, очень несущественно - за счет индексов может быть расхождение).

Но это точно не ассоциативный массив (которого, кстати, в js не существует - это простой Object) и занимает он точно другой объем. Правда, не могу сказать, в какую сторону, так как не исследовал, но Array и Object - примитывы, но в js все есть объект, следовательно, Array может расширять реализацию Object, что не может не отразиться на объеме.
Другое дело, что хранение в памяти индексов точно разное: для массивов оно только численное (т.е. занимает "мало"), а для объектов (ассоциативных массивов) - литеральное, т.е. может занимать значительно больше.

Автор: Aliance 14.4.2009, 12:44
Нет, все это я понимаю и знаю.
Вопрос именно вот в чем:
Цитата(IDVsbruck @  14.4.2009,  13:28 Найти цитируемый пост)
Думаю, это служит подтверждением, что объем в памяти этих структур не должен изменяться 

поясни этот момент. То есть примитивы "undefined" и "не задан вовсе" - одно и то же в контексте выделяемой памяти? Просто мне почему-то кажется, что "undefined" - это все-таки есть некое объявление переменной (объявление в том, что переменная не существует). Я не прав?

P.S.: разности в памяти под сами индексы, конечно же, в расчет не берем.

Автор: IDVsbruck 14.4.2009, 12:51
Ага, разобрался. Вот выдержки из ECMA-262:

15.4 Объекты Array
Объекты типа Array (массивы) специальным образом обрабатывают обращения к определённому классу имён свойств. Имя свойства P (в форме строкового значения) является индексом массива в том и только в том случае, когда ToString(ToUint32(P)) равняется P и ToUint32(P) не равняется 232 - 1. Каждый объект типа Array обладает свойством length, значение которого всегда равно неотрицательному целому, меньшему, чем 232 . Значение свойства length численно больше чем имя каждого свойства, являющегося индексом массива. Когда свойства объекта типа Array создаются или меняются, другие свойства по необходимости корректируются для поддержания этого соотношения.
...
15.4.1 Вызов конструктора Array как функции 
Когда Array вызывается не как конструктор, а как функция, он создаёт и инициализирует новый объект типа Array. Таким образом, вызов функции Array(...) эквивалентен выражению создания объекта new Array(...), вызванному с теми же аргументами.
...
15.4.2.2 new Array(len)
...
Если аргумент len имеет тип Number и ToUint32(len) равно len, то свойство length создаваемого объекта устанавливается в ToUint32(len). Если аргумент len имеет тип Number и ToUint32(len) не равняется len - бросается исключение RangeError.


То есть на хранения индекса, будь то 0 или 999999999999, все равно выделяется 4 байта (2^32), а индекс - только указатель. Следовательно, оба варианта будут занимать в памяти совершенного одинаковый объем.

Автор: Aliance 14.4.2009, 13:39
Отлично, спасибо smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)