#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 записей.
Комментариев нет:
Отправить комментарий