Необходимо передавать таблицы (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] = {}
Вопросы :
1) Останется ли таблица
var массивом ( таблицей только c array part ), или преобразуется в hash ( таблицей с двумя частями array и hash ). ( Сам думаю ответ "останется только с array-part", так как структура таблицы не затронута - затронуты лишь значения элементов, но очень сомневаюсь в этом ответе, а нужно знать наверняка ).
2) Почему? :) Как это проверить?
3) Предельно уточняя: если таблица изначально имеет только 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] = {} приведет к накладным расходам памяти (подробнее тут
www.lua.org/gems/sample.pdf )
Ответ правильный или нет?
Спасибо!