函数参数声明本地变量的功能影响

在编写一些一次性的Lua代码时,我发现自己在代码高尔夫上。尽管这段代码无法放在一行上......

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)
   -- 此行故意留空
   return function() c=a+b+c end
end

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

点赞
用户2505965
用户2505965

你可以用 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 的声明位置略有不同,参数大小也有一些差异,这是可以理解的。

2016-08-27 02:17:34