通过函数参数声明局部变量的功能影响

时间:2016-08-26 23:13:55

标签: lua

在写一些one-off Lua code作为答案时,我发现自己编码打高尔夫球以适应单行的功能。虽然这段代码不适合一行......

foo=function(a,b) local c=bob; some_code_using_c; return c; end

......我意识到我可以通过将其转换为:

来使其合适
foo=function(a,b,c) c=bob; some_code_using_c; return c; end

使用函数参数声明函数局部变量(假设我知道第三个参数永远不会传递给函数)而不是使用local是否有任何性能或功能影响?这两种技术的表现是否有所不同?

注意:为了清晰起见,我在上面添加了分号,并帮助那些不了解Lua处理空白的人。我知道他们没有必要;如果您按照上面的链接,您将看到实际代码不使用它们。

编辑根据@ Oka的回答,我将这两个函数生成的字节码与单独的文件进行了比较:

function foo(a,b)
   local c
   return function() c=a+b+c end
end
function foo(a,b,c)
   -- this line intentionally blank
   return function() c=a+b+c end
end

忽略地址,字节代码报告是相同的(除了为函数列出的参数数量)。

1 个答案:

答案 0 :(得分:2)

您可以继续查看使用luac -l -l -p my_file.lua生成的Lua字节码,比较指令集和寄存器布局。

在我的机器上:

function foo (a, b)
    local c = a * b
    return c + 2
end

function bar (a, b, c)
    c = a * b
    return c + 2
end

产地:

function <f.lua:1,4> (4 instructions at 0x80048fe0)
2 params, 4 slots, 0 upvalues, 3 locals, 1 constant, 0 functions
        1       [2]     MUL             2 0 1
        2       [3]     ADD             3 2 -1  ; - 2
        3       [3]     RETURN          3 2
        4       [4]     RETURN          0 1
constants (1) for 0x80048fe0:
        1       2
locals (3) for 0x80048fe0:
        0       a       1       5
        1       b       1       5
        2       c       2       5
upvalues (0) for 0x80048fe0:

function <f.lua:6,9> (4 instructions at 0x800492b8)
3 params, 4 slots, 0 upvalues, 3 locals, 1 constant, 0 functions
        1       [7]     MUL             2 0 1
        2       [8]     ADD             3 2 -1  ; - 2
        3       [8]     RETURN          3 2
        4       [9]     RETURN          0 1
constants (1) for 0x800492b8:
        1       2
locals (3) for 0x800492b8:
        0       a       1       5
        1       b       1       5
        2       c       1       5
upvalues (0) for 0x800492b8:

没有太大区别,有吗?如果我没有弄错的话,那么为每个c指定一个稍微不同的声明位置,以及params大小的差异,正如人们所期望的那样。