在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
原文:https://blog.csdn.net/zhuzhuyule/article/details/41086745 一、Lua虚拟机的栈 1.1先简单介绍下Lua虚拟机的栈,如图:
规则: ①若Lua虚拟机堆栈里有N个元素,则可以用 1 ~ N 从栈底向上索引,也可以用 -1 ~ -N 从栈顶向下索引,一般后者更加常用 ②堆栈的每个元素可以为任意复杂的Lua数据类型,堆栈中没有元素的空位,隐含为包含一个“空”类型数据 特性: 若有4个元素分别入栈,则: 索引相关: ①. 正数索引,不需要知道栈的大小,我们就能知道栈底在哪,栈底的索引永远是1
2.1代码演示 直接进入主题了,正如上节实例代码: Lua代码: --filename: luafile.lua C++代码(其他代码工作原理一样的这里宿主语言使用C++好了):
执行结果:
现在来开始分析过程:①~~④步
这里注释都写 明白了吧, ④:这个过程,是为了确认栈底是空的,以便后面的操作是按照顺序入栈的且从1号栈位开始
1> C++告诉Lua虚拟机(L),函数以输入栈,函数传入0个参数,会返回4个函数,不需要错误信息(0)。(分别 对应上面四个参数)。(栈中一个元素:“LuaFunc" ) 2> 这里,C++(宿主语言)请求完毕了,虚拟机(L)开始访问栈,从栈中取出“LuaFunc"。(栈中无元素了:null) 3> 虚拟机得到 “LuaFunc" 信息送给 Lua程序(编译器)。(栈中无元素了:null) 4> Lua程序 在 调用的 Lua文件全局表(Global table)中查找 “LuaFunc" ,并运行返回结果“1,2,3,4”。(栈中无元素了:null) 5> Lua程序得到返回结果“1,2,3,4” 将结果再压入栈;压入顺序为,顺序的,“1”先入栈底,“2”再入栈,以此类推。(栈中四个元素:1,2,3,4)(顺序为栈底->栈顶) 6> 最后,C++(宿主语言)再去栈中读取数据;这里 lua_tostring(L,1)是读取函数,不会改变栈内的结果的,所以当地⑥步执行完,栈中还是四个元素:1,2,3,4 提示:若使用lua_pop(L,1) 去操作的话,可以弹出指定的位置的栈内容 ⑦这步也很重要,使用完虚拟机,需要手动关闭的。 2.3完美动态展示: |
请发表评论