lua2.1 全局变量和局部变量(完善中)
2010-05-01 10:26
387 查看
变量是lua2.1中的基石,由于各变量的作用的不同,我们一般分为全局变量和局部变量,在lua2.1中也有这两种变量,但是在其内部的
具体实现的却很难让人理解,本文主要来探讨lua2.1中全局变量和局部变量的具体实现细节。
与以往的分析不同,这次我们先来个实例。
b = 1;
function func1(c)
local d, d1;
local e;
e = 1;
a = 1;
return a;
end
上面的lua语句得到的指令如下:
CODE
1 ADJUST 1
3 ADJUST 3
5 ADJUST 4
6 PUSH1
7 STORELOCAL3
8 PUSH1
9 STOREGLOBAL 55
12 PUSHGLOBAL 55
16 RETCODE 4
18 ADJUST 1
20 RETCODE 1
CODE
0 PUSH1
1 STOREGLOBAL 50
4 RETCODE0
我们之后这个函数func1分析下来一共有四个局部变量,第一个局部变量是在分析func的参数的时候得到的,伴随这个变量的确定还有
一条指令是ADJUST 1来调整栈顶使得参数数量为1;第二和第三个局部变量是在分析语句local d, d1的时候确定的,我们现在可以先
断定一个local关键字会带来一调ADJUST指令,那么时会有指令ADJUST 3。第四个和前面两个一样。那么接着的a是局部变量吗?显然
不是,因为它分析的结果是PUSH1 STOREGLOBAL 55,说明它是全局变量。好了,到目前为止我们知道有两种情况可以使的一个变量
成为局部变量,第一个是形参,第二个是被关键字local修饰过的变量。其它的八九不离十是全局变量。
下面我们考虑几种情况:
情况1:使用一个已有的全局变量的名字作为局部变量
b = 1;
function func1(c)
local b;
b = 2;
end
指令:
CODE
1 ADJUST 1
3 ADJUST 2
4 PUSH2
5 STORELOCAL1
7 ADJUST 1
9 RETCODE 1
CODE
0 PUSH1
1 STOREGLOBAL 50
4 RETCODE0
通过指令我们知道函数func1执行过后并不会修改全局变量b的值。
情况2:将全局变量作为参数传入的时候
b = 1;
function func1(c)
c = 2;
end
func1(b);
CODE
1 ADJUST 1
2 PUSH2
3 STORELOCAL0
5 RETCODE 1
指令:
CODE
0 PUSH1
1 STOREGLOBAL 50
4 PUSHGLOBAL 52
7 PUSHGLOBAL 50
10 CALLFUNC 1 0
13 RETCODE0
通过指令我们知道func1使用的只是b的拷贝,所以函数中对参数c的修改并不能对b的值造成影响,
另外一个原因是,如果想修改一个全局变量,那么你必须使用STOREGLOBAL之类的指令才行,
STORELOCAL系列的指令只会修改栈上的数据。
具体实现的却很难让人理解,本文主要来探讨lua2.1中全局变量和局部变量的具体实现细节。
与以往的分析不同,这次我们先来个实例。
b = 1;
function func1(c)
local d, d1;
local e;
e = 1;
a = 1;
return a;
end
上面的lua语句得到的指令如下:
CODE
1 ADJUST 1
3 ADJUST 3
5 ADJUST 4
6 PUSH1
7 STORELOCAL3
8 PUSH1
9 STOREGLOBAL 55
12 PUSHGLOBAL 55
16 RETCODE 4
18 ADJUST 1
20 RETCODE 1
CODE
0 PUSH1
1 STOREGLOBAL 50
4 RETCODE0
我们之后这个函数func1分析下来一共有四个局部变量,第一个局部变量是在分析func的参数的时候得到的,伴随这个变量的确定还有
一条指令是ADJUST 1来调整栈顶使得参数数量为1;第二和第三个局部变量是在分析语句local d, d1的时候确定的,我们现在可以先
断定一个local关键字会带来一调ADJUST指令,那么时会有指令ADJUST 3。第四个和前面两个一样。那么接着的a是局部变量吗?显然
不是,因为它分析的结果是PUSH1 STOREGLOBAL 55,说明它是全局变量。好了,到目前为止我们知道有两种情况可以使的一个变量
成为局部变量,第一个是形参,第二个是被关键字local修饰过的变量。其它的八九不离十是全局变量。
下面我们考虑几种情况:
情况1:使用一个已有的全局变量的名字作为局部变量
b = 1;
function func1(c)
local b;
b = 2;
end
指令:
CODE
1 ADJUST 1
3 ADJUST 2
4 PUSH2
5 STORELOCAL1
7 ADJUST 1
9 RETCODE 1
CODE
0 PUSH1
1 STOREGLOBAL 50
4 RETCODE0
通过指令我们知道函数func1执行过后并不会修改全局变量b的值。
情况2:将全局变量作为参数传入的时候
b = 1;
function func1(c)
c = 2;
end
func1(b);
CODE
1 ADJUST 1
2 PUSH2
3 STORELOCAL0
5 RETCODE 1
指令:
CODE
0 PUSH1
1 STOREGLOBAL 50
4 PUSHGLOBAL 52
7 PUSHGLOBAL 50
10 CALLFUNC 1 0
13 RETCODE0
通过指令我们知道func1使用的只是b的拷贝,所以函数中对参数c的修改并不能对b的值造成影响,
另外一个原因是,如果想修改一个全局变量,那么你必须使用STOREGLOBAL之类的指令才行,
STORELOCAL系列的指令只会修改栈上的数据。
相关文章推荐
- 使用Lua 局部变量来优化性能,同一时候比較局部变量和全局变量
- lua中的全局变量与局部变量
- lua的全局变量、局部变量、函数闭包和非局部变量(upvalue)
- 使用Lua 局部变量来优化性能,同时比较局部变量和全局变量
- lua学习(2)_____lua的注释和全局变量、局部变量
- Lua编程笔录--Lua初识及语法一(注释,变量命名,全局/局部变量,数据类型)
- lua中的全局变量与局部变量与块
- Javascript:谈谈JS的全局变量跟局部变量
- C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
- 类变量、成员变量、实例变量、局部变量、静态变量、全局变量 的解释。
- SQL中全局变量和局部变量的区别及用法
- python中的全局变量和局部变量以及可变数据类型
- C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
- 谈谈JS的全局变量跟局部变量
- 在javascript中关于局部变量和全局变量简析
- 局部变量,全局变量和数组
- C中全局变量和局部变量的初始化问题
- 全局变量 vs 局部变量
- js---局部变量和全局变量(1)
- Lua语法小贴士(十)全局变量