鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > erlang > >

Lua和C++交互详细总结_1_Lua堆栈

来源:互联网 作者:佚名 时间:2016-06-11 09:27
一、Lua堆栈 要理解Lua和C交互,首先要理解Lua堆栈。 简单来说,Lua和C/C语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。 在Lua中,Lua堆栈就是一个struct, 堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索

一、Lua堆栈

要理解Lua和C++交互,首先要理解Lua堆栈。

简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。

在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶。如图:


lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的:

         TValue stack[max_stack_len]  // 欲知内情可以查 lstate.c 的stack_init函数存入栈的数据类型包括数值, 字符串, 指针, talbe, 闭包等, 下面是一个栈的例子:

执行下面的代码就可以让你的lua栈上呈现图中的情况

    lua_pushcclosure(L, func, 0) // 创建并压入一个闭包
    lua_createtable(L, 0, 0)        // 新建并压入一个表
    lua_pushnumber(L, 343)      // 压入一个数字
    lua_pushstring(L, “mystr”)   // 压入一个字符串

这里要说明的是, 你压入的类型有数值, 字符串, 表和闭包[在c中看来是不同类型的值], 但是最后都是统一用TValue这种数据结构来保存的:), 下面用图简单的说明一下这种数据结构:


 TValue结构对应于lua中的所有数据类型, 是一个{值, 类型} 结构, 这就lua中动态类型的实现, 它把值和类型绑在一起, 用tt记录value的类型, value是一个联合结构, 由Value定义, 可以看到这个联合有四个域, 先说明简单的

  •         p -- 可以存一个指针, 实际上是lua中的light userdata结构
  •         n -- 所有的数值存在这里, 不过是int , 还是float
  •         b -- Boolean值存在这里, 注意, lua_pushinteger不是存在这里, 而是存在n中, b只存布尔
  •         gc -- 其他诸如table, thread, closure, string需要内存管理垃圾回收的类型都存在这里
  •         gc是一个指针, 它可以指向的类型由联合体GCObject定义, 从图中可以看出, 有string, userdata, closure, table, proto, upvalue, thread

    从下面的图可以的得出如下结论:

        1. lua中, number, boolean, nil, light userdata四种类型的值是直接存在栈上元素里的, 和垃圾回收无关.

        2. lua中, string, table, closure, userdata, thread存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收.




上一篇:ConcurrentHashMap源码
下一篇:oracle--
网友评论
<