いいえ、local
を何度も何度も使用する必要はありません。変数i1
とi2
は、最初の行自体のために関数の範囲でlocal
になります。
同じ変数を何度も何度も定義するのは間違いありません。スタックの新しい位置を新しいものに割り当て、古いものをシャドーするだけです。
次は、単純な機能のための命令の出力です:
function t()
local i = 2
local i = 3
end
t()
function <temp.lua:1,4> (3 instructions, 12 bytes at 00658990)
0 params, 2 slots, 0 upvalues, 2 locals, 2 constants, 0 functions
1 [2] LOADK 0 -1 ; 2
2 [3] LOADK 1 -2 ; 3
3 [4] RETURN 0 1
だけi = 3
に二local i = 3
を更新:
function t()
local i = 2
i = 3
end
t()
function <temp.lua:1,4> (3 instructions, 12 bytes at 00478990)
0 params, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions
1 [2] LOADK 0 -1 ; 2
2 [3] LOADK 0 -2 ; 3
3 [4] RETURN 0 1
お知らせ秒で違い命令。
とは別に、この機能は非常に非効率的です。二宣言にlocal
かどうかを使用して、
function Trim(sInput)
return sInput:match "^%s*(.-)%s*$"
end
スタック位置(ローカル変数)は対象ではありませんガベージコレクションへシャドウされたローカル変数に格納された値は、引き続きアクセス可能であるとみなされます。 –
@EgorSkriptunoffこれについての仕様書はありますか、またはそれは観測に基づいていますか? (私は、標準的な実装では、デバッガを書いている間にシャドーされたローカルを見てきたことは知っています。)しかし、コンパイラはスタックの使用を自由に自由にすることはできませんか? –
@TomBlodget - IMOでは、典型的なLuaプログラムではスタックの最適化が役立つことはほとんどありません。 –