#lua
Необходимо передавать таблицы (tables) в Lua коде по сети (компьютерная мультиплеерная игра). В связи с чем очень актуален вопрос о размерах передаваемых данных (о сохранении их как можно меньшими). Для сохранения структуры таблицы и "удержания" её в array-like стиле рекомендуют использовать table.insert, table.remove... Имеется код (сори за форматирование, не работает в браузере): local var = {} for i = 1, 10000, 1 do table.insert ( var, i ) end var[10000] = { var = 1, some = "string", another = {} } var[555] = false var[1] = 1 var[2] = {} var[1] = {} Вопросы: Останется ли таблица var массивом ( таблицей только c array part ), или преобразуется в hash ( таблицей с двумя частями array и hash ). ( Сам думаю ответ "останется только с array-part", так как структура таблицы не затронута - затронуты лишь значения элементов, но очень сомневаюсь в этом ответе, а нужно знать наверняка ). Почему? :) Как это проверить? Предельно уточняя: если таблица изначально имеет только array-part, то приведет ли изменение значения элемента таблицы напрямую через синтаксис var[1] = {} var[2] = false var[3] = 1 и т.п. к изменению структуры таблицы и появлению у ней hash-part? ( При условии что заранее дано:) local var = {} for i = 1, 10000, 1 do table.insert ( var, i ) end Подозреваю, что ответ для кода выше "нет", но: var[10001] = 1 Уже затронет структуру таблицы и создаст "накладные расходы" по памяти. В связи с чем думаю ответ таков ( для кода выше) : до n <= 10000 код var[n] = {} не затрагивает структуру таблицы, а значит не ведет к созданию hash-part ( таблица остается array-like). Однако код var[n + 1] = {} приведет к накладным расходам памяти (подробнее тут http://www.lua.org/gems/sample.pdf ) Ответ правильный или нет? Спасибо!
Ответы
Ответ 1
Суть в том что в Lua есть только ассоциативные таблицы "ключ-значение". Она может только притворятся списком. Посему arr['1'] = 1; arr['1000000'] = 1 не значит что таблица разбухнет аж на 999999 записей.
Комментариев нет:
Отправить комментарий