码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-06-12 02:52:22      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

一、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存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收.




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

标签:

原文地址:http://blog.csdn.net/heyuchang666/article/details/51612892

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!