2016-08-26 31 views
2

在寫一些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的處理。我知道他們沒有必要;如果你按照上面的鏈接,你會看到實際的代碼不使用它們。


編輯基於@岡的回答,我比較了這兩個函數生成的字節碼,在不同的文件:

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 

忽略地址,字節碼報告相同(功能列出的參數數量除外)。

回答

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指定一個稍微不同的聲明位置,以及參數大小的差異,正如人們所預料的那樣。

+0

這是一個引人注目的論點,特別是兩個都列出了相同數量的「本地人」。 – Phrogz