2012-09-21 27 views
0

我有在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的垃圾收集器将被迫做了很多工作,如果我修改我的代码,我做了什么?


注意

  • 不要混淆与我要问的问题的问题用简单的例子。
  • 我没有任何方法来测量内存使用情况或收集数量,所以我不能尝试

回答

5

我知道Lua中没有引用支持传递paramters

术语“参考”过载,造成了很多混乱(尤其是在Java world的,我见过的人拒绝承认甚至存在其中一种含义)。

传递通过引用可意味着:

  1. 跑过位置的对象的在存储器中,而不是对象本身。这就是"pass by reference" in C的含义。从这个意义上讲,Java 确实通过引用传递,对于其许多类型(用户数据,表等),Lua也是如此。

  2. 变量的别名,这样别名的任何修改都会反映在原始文件中。这不仅仅是不值得传递,如果变量保存对象的位置,则可以通过别名分配不同的位置。你不能这样做#1,在那里你通过一个对象的引用,而不是一个变量。这些类型的引用在C#,C++等中受支持,但不支持C或Lua。

更简单地说:

  1. 通过值:在调用函数的对象是被调用函数接收对象的副本。
  2. 传递参考^ 1:调用函数中的对象可以被调用函数修改。
  3. 传递参考^ 2:调用函数中的变量可以被调用函数修改。

,而是如果我需要将项目添加到我的表

只是通过表 - 一个参考,不是复制,传递。

+0

从技术上讲,C++没有“变量的别名”引用。引用变量是存储对象的引用的变量。这与在Lua传递一张桌子没什么两样。 –

+2

从Lua手册:“表,函数,线程和(完整)用户数据值是对象:变量实际上并不包含这些值,只有对它们的引用。赋值,参数传递和函数返回总是处理对这些值的引用;这些操作并不意味着任何形式的拷贝。“ – jpjacobs

相关问题