Ich habe eine Funktion erstellt, die Größe eines Arrays und setzt neue Einträge auf 0, kann aber auch die Größe des Arrays auf 2 verschiedene Arten verringern: 1. Einfach einstellen n
Eigenschaft auf die neue Größe (der Längenoperator kann aus diesem Grund nicht verwendet werden). 2. Setzen Sie alle Werte nach der neuen Größe auf nil bis zu 2 *, um eine erneute Bereinigung zu erzwingen.Erzwingen einer Tabelle rehash funktioniert nicht nach einer vorherigen rehash
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
Wie ich es getestet:
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
Jedoch, wenn ich nicht true
als drittes Argument auf den zweiten Aufruf von Resize passieren kann (so ist es kein Aufguss erzwingt auf dem zweiten Aufruf), der dritte Aufruf endet damit, es erneut zu tun.
Fehle ich etwas? Ich erwarte, dass der dritte nach dem zweiten auch rehasht.
Ihre Frage ist sehr verwirrend.Das zweite Argument von resize ist die Anzahl der Elemente, du meinst drittes Argument. der dritte Anruf tut etwas, wenn der zweite nicht tut, aber Sie erwarten, dass der dritte etwas nach dem zweiten tut? Was? – Piglet
Ja Entschuldigung, ich bezog mich auf das dritte Argument. – Matthew