| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Длинные массивы и память |
| Автор: Aliance 14.4.2009, 09:24 | ||||
Интересует следующая вещь, если я имею массив вида:
будет ли этот код намного больше есть памяти, чем следующий:
|
| Автор: bars80080 14.4.2009, 09:33 |
| имхо, да. уже не раз встречал ситуацию, когда развёртывание массива в котором были только элементы [2009] к примеру приводило к тому, что и все элементы от 0 тоже существуют |
| Автор: Aliance 14.4.2009, 09:55 |
| Существуют - это одно, а вот нагружают ли они оперативку? Один товарищ мне сказал, что нет. Фактически, это ассоциативный массив получается по его словам. Но подкрепить свои слова он не смог. И если все же нагрузка есть - какие альтернативы? |
| Автор: IDVsbruck 14.4.2009, 12:28 | ||||
При
длина массива a.length будет равна 2. А при
длина будет уже 1000000000000, при указании любого другого индекса выдаст undefined, то есть "промежуточные" элементы точно не создаются, также как для первого случая при задании a[10] выдаст тот же undefined. Думаю, это служит подтверждением, что объем в памяти этих структур не должен изменяться (по крайней мере, очень несущественно - за счет индексов может быть расхождение). Но это точно не ассоциативный массив (которого, кстати, в js не существует - это простой Object) и занимает он точно другой объем. Правда, не могу сказать, в какую сторону, так как не исследовал, но Array и Object - примитывы, но в js все есть объект, следовательно, Array может расширять реализацию Object, что не может не отразиться на объеме. Другое дело, что хранение в памяти индексов точно разное: для массивов оно только численное (т.е. занимает "мало"), а для объектов (ассоциативных массивов) - литеральное, т.е. может занимать значительно больше. |
| Автор: 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 |
| Отлично, спасибо |