所有局部变量都是在编译(
load
)时“创建”的,它们只是函数激活记录中的局部块的索引。每次定义一个
local
时,该块就会增加1个大小。每次
do..end
/词法块结束时,它都会缩小回去。峰值用作总大小:
function ()
local a
do
local x
local y
end
do
local z
end
end
上述函数有3个本地槽(在load
时确定,而不是在运行时确定)。
关于您的情况,本地块大小没有区别,而且luac
/5.1生成相同的列表(只有索引不同):
$ luac -l -
local a
^D
main <stdin:0,0> (7 instructions, 28 bytes at 0x7fee6b600000)
0+ params, 5 slots, 0 upvalues, 5 locals, 3 constants, 0 functions
1 [1] LOADK 1 -1
2 [1] LOADK 2 -2
3 [1] LOADK 3 -1
4 [1] FORPREP 1 1
5 [1] MUL 0 4 -3
6 [1] FORLOOP 1 -2
7 [1] RETURN 0 1
vs
$ luac -l -
for i=1,100000000 do local a = i * 3 end
^D
main <stdin:0,0> (7 instructions, 28 bytes at 0x7f8302d00020)
0+ params, 5 slots, 0 upvalues, 5 locals, 3 constants, 0 functions
1 [1] LOADK 0 -1
2 [1] LOADK 1 -2
3 [1] LOADK 2 -1
4 [1] FORPREP 0 1
5 [1] MUL 4 3 -3
6 [1] FORLOOP 0 -2
7 [1] RETURN 0 1
// [n]
-我的注释。
luac -l
并稍微了解了一下虚拟机指令集。) - Tom Blodget