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

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

时间: 2024-12-17 14:36:06

Lua和C++交互详细总结_1_Lua堆栈的相关文章

Lua和C++交互详细总结_2_堆栈的操作

二.堆栈的操作 因为Lua与C/C++是通过栈来通信,Lua提供了C API对栈进行操作. 我们先来看一个最简单的例子: #include <iostream> #include <string.h> using namespace std; extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } void mai

Lua和C++交互详细总结

转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.如图: 二.堆栈的操作 因为Lua与C/C++是通过栈来通信,Lua提供了C API对栈进行操作. 我们

Lua和C++交互详细总结_5_总结

Lua和C++是通过一个虚拟栈来交互的. C++调用Lua实际上是:由C++先把数据放入栈中,由Lua去栈中取数据,然后返回数据对应的值到栈顶,再由栈顶返回C++. Lua调C++也一样:先编写自己的C模块,然后注册函数到Lua解释器中,然后由Lua去调用这个模块的函数.

Lua和C++交互详细总结_3_C++调用Lua

三C++调用Lua 我们经常可以使用Lua文件来作配置文件.类似ini,xml等文件配置信息.现在我们来使用C++来读取Lua文件中的变量,table,函数. lua和c通信时有这样的约定: 所有的lua中的值由lua来管理, c++中产生的值lua不知道, 类似表达了这样一种意思: "如果你(c/c++)想要什么, 你告诉我(lua), 我来产生, 然后放到栈上, 你只能通过api来操作这个值, 我只管我的世界", 这个很重要, 因为: "如果你想要什么, 你告诉我, 我来

Lua和C++交互详细总结_4_Lua调用C++

四.Lua调用C++ 我们分三个方法实现它. 方法一:直接将模块写入Lua源码中 在Lua中调用C/C++,我们可以将函数写lua.c中,然后重新编译Lua文件. 编译好后是这样子的:(如图) 然后我们可以在lua.c中加入我们自己的函数.函数要遵循规范(可在lua.h中查看)如下: typedef int (*lua_CFunction) (lua_State *L); 换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值.因为这个函数使用Lua栈作为参数,所以它可以

Lua和C++交互总结(很详细)

一不小心又标题党了?不好意思哈- 翻看了以前的博客,发下废话太多了自己都看不下去啊,恩,以后尽量写得简洁一些. 本文不涉及lua语法学习,如果有需要,请移步:http://book.luaer.cn/ 一.lua堆栈 要理解lua和c++交互,首先要理解lua堆栈. 简单来说,Lua和C/c++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在lua中,lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.

lua与C交互

什么样类型的函数可以被Lua调用 typedef int (*lua_CFunction) (lua_State *L); 符合类型的函数怎样处理后才可以被Lua调用 使用lua_register或者 lua_pushfunction和lua_setglobal()把要调用的函数加入到lua状态机中. #define lua_register(L,n,f) / (lua_pushcfunction(L, f), lua_setglobal(L, n)) lua_register的第二个参数就是L

用好lua+unity,让性能飞起来——lua与c#交互篇

前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法.然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态.事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多. 因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因.只有理解了原因,才能很清

用好Lua+Unity,让万金6.0平台搭建性能飞起来——Lua与C#交互篇

前言万金6.0平台搭建论坛:haozbbs.com Q1446595067 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文.整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法.然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态.事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多.因此,这篇文章是从一堆