【问题标题】:Functional impact of declaring local variables via function parameters通过函数参数声明局部变量的功能影响
【发布时间】:2017-01-03 16:30:44
【问题描述】:

在写一些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

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

【问题讨论】:

    标签: lua


    【解决方案1】:

    您可以继续查看使用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 指定的声明位置略有不同,而且参数大小也有所不同,正如人们所预料的那样。

    【讨论】:

    • 这是一个令人信服的论点,尤其是两者都列出了相同数量的locals
    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2012-05-23
    相关资源
    最近更新 更多