我有在Lua一个函数,在桌子上工作,多次将条目添加到表:将一个表重复传递给一个函数分配更多的内存?
function DoStuff()
local table = {};
for i = 1, 1000 do
local name, value = GetSomething(i);
if (CheckSomething(name, value))
table[name] = value
end;
end;
end;
我知道这是快; Lua有一个很好的散列表算法。但现在我需要打出我的职责的一部分,所以我可以单元测试:
function DoStuff()
local table = {};
for i = 1, 1000 do
local name, value = GetSomething(i);
--split out checking so it's testable
table = ParseTheThing(table, name, value);
end;
end;
我知道Lua does not support passing paramters by reference,而是如果我需要将项目添加到我的table
,Lua中做一个拷贝我必须返回一个副本:
--Core checking function
function ParseTheThing(table, name, value)
if (CheckSomething(name, value))
table[name] = value
end;
return table;
end;
所以,在我看来,每一次我打电话CheckSomething
的Lua将创建另一个表,需要进行垃圾回收。
或者可能不是。也许Lua的确实支持通过引用传递参数,我可以简单地调用:
ParseTheThing(table, name, value);
--Core checking function
function ParseTheThing(table, name, value)
if (CheckSomething(name, value))
table[name] = value
end;
end;
威尔Lua的垃圾收集器将被迫做了很多工作,如果我修改我的代码,我做了什么?
注意:
- 不要混淆与我要问的问题的问题用简单的例子。
- 我没有任何方法来测量内存使用情况或收集数量,所以我不能尝试。
从技术上讲,C++没有“变量的别名”引用。引用变量是存储对象的引用的变量。这与在Lua传递一张桌子没什么两样。 –
从Lua手册:“表,函数,线程和(完整)用户数据值是对象:变量实际上并不包含这些值,只有对它们的引用。赋值,参数传递和函数返回总是处理对这些值的引用;这些操作并不意味着任何形式的拷贝。“ – jpjacobs