Я создал функцию, которая изменяет размер массива и устанавливает новые записи в 0, но также может уменьшить размер массива двумя разными способами: 1. Просто установите n
свойство нового размера (по этой причине оператор длины не может быть использован). 2. Установка всех значений после нового размера до нуля до 2 *, чтобы принудительно перефразировать.Принудительное повторное использование таблицы после предыдущего перерыва
local function resize(array, elements, free)
local size = array.n
if elements < size then -- Decrease Size
array.n = elements
if free then
size = math.max(size, #array) -- In case of multiple resizes
local base = elements + 1
for idx = base, 2*size do -- Force a rehash -> free extra unneeded memory
array[idx] = nil
end
end
elseif elements > size then -- Increase Size
array.n = elements
for idx = size + 1, elements do
array[idx] = 0
end
end
end
Как я тестировал:
local mem = {n=0};
resize(mem, 50000)
print(mem.n, #mem) -- 50000 50000
print(collectgarbage("count")) -- relatively large number
resize(mem, 10000, true)
print(mem.n, #mem) -- 10000 10000
print(collectgarbage("count")) -- smaller number
resize(mem, 20, true)
print(mem.n, #mem) -- 20 20
print(collectgarbage("count")) -- same number as above, but it should be a smaller number
Однако, когда я не проходят true
в качестве третьего аргумента на второй вызов изменения размера (так что это не заставит перепев на второй вызов), третий вызов в конечном итоге переигрывает его.
Я что-то упустил? Я ожидаю, что третий будет перефразировать после второго.
Ваш вопрос очень запутан.Второй аргумент resize - это количество элементов. Вы имеете в виду третий аргумент. третий вызов делает что-то, когда второе не делает, но вы ожидаете, что третий сделает что-то после второго? что? – Piglet
Да, извините, я имел в виду третий аргумент. – Matthew