Lua
文章平均质量分 87
啦啦拉德玛西亚
这个作者很懒,什么都没留下…
展开
-
Tolua++文档(翻译)
Tolua++是tolua的升级版,是把C/C++和lua代码结合使用的一种工具。tolua++包括一些来自C++的新功能,如:支持std::string,并将其作为一种基本类型支持class template当然,还有一些新的特点和bug的修复。Tolua的使用大大简化了C/C++和lua的代码一体化。基于干净的头文件(或者扩展的头文件),tolua会自动生成相关的代码供lua访转载 2016-08-04 11:55:16 · 797 阅读 · 0 评论 -
Lua中Userdata类型源码实现
1、概述 Lua中userdata分两种,一种是轻量级userdata(light userdata),轻量级userdata是一种表示C指针的值,对Lua虚拟机来说,这种数据类型不需要GC(垃圾回收),其指向的内存由用户分配和释放,其实现就是一个void *p指针;后一种userdata类型完全userdata(full userdata),内存是由Lua虚拟机分配,并有GC机制负责处转载 2017-09-16 11:09:06 · 1275 阅读 · 0 评论 -
lua _G 实现
在Lua脚本层,Lua将所有的全局变量保存在一个常规的table中,这个table被称为全局环境,并且将这个table保存在一个全局变量_G中,也就是说在脚本中可以用_G获取这个全局table,并且有_G._G == _G,在默认情况,Lua在全局环境_G中添加了标准库比如math、函数比如pairs等。可以通过下面代码,可以递归打印_G中的所有信息:_G = {_G,........}转载 2017-09-16 16:27:45 · 1280 阅读 · 0 评论 -
Lua upvalue 函数 闭包
闭包(closure):是由一个函数和该函数会访问到的非局部变量(或者是upvalue)组成的,函数是一个么有upvalue的闭包非局部变量:不在自己定义的域中的局部变量函数与所有其他的值是一样都是匿名的,即他们没有名称。当讨论一个函数时(例如print),实质上在讨论一个持有某个函数的变量,一个函数定义实质就是一条赋值语句,这条语句创建了一种类型为“函数”的值,并赋值给一个变转载 2017-09-19 10:50:07 · 841 阅读 · 0 评论 -
Lua中require、dofile、loadfile的
可以说Lua之所以称为是一种解释型的语言,正是因为有诸如load这样的函数,因为这样的函数使得Lua可以执行动态生成的代码。下面具体来分析这些函数。 load函数 load函数原型如下:[plain] view plain copyload (chunk [, chunkname [, mode [, env]]]) 该函数加转载 2017-09-19 14:31:20 · 873 阅读 · 0 评论 -
lua TValue类型分析
Lua 中数据的基本结构 下面分析每个结构中各个字段的含义TValueTvalue中的tt 存储了 当前数据的类型,在Lua中有8种基础类型:nil、boolean、number、string、userdata、function、thread和table。Value 为实际存储的值Value p:为c中传入的指针,由c 分配和释放原创 2017-09-15 18:31:38 · 1341 阅读 · 0 评论 -
Lua table数据结构 算法分析
一、数据结构1、Nodenext:当hash冲突时,next = 冲突的node位置 - 应该2、Tablelsizenode:hash数组大小 = 2^lsizenodenode :指向hash部分arraysize :数组部分大小array :指向数组部分lastfree :指向hash表中空闲的节点。每次hash表发生冲突时,都会把节点放在lastfree位置原创 2017-09-28 16:43:05 · 920 阅读 · 0 评论 -
Lua 字符串TString数据结构即算法分析
这里主要写Lua中的字符串TString相关结构和算法。文章中没有贴Lua源码,只画出了结构图,和算法的伪代码。这样阅读起来更加直观。一、TString的概述1、lua中字符串是常量,例s = s .. 1 创建了一个新的字符串赋值给s,并不是改变了s字符串中的数据。2、lua中字符串分为长字符串和短字符串。长字符串和短字符串区别(1)存储方式:短字符串:全局存储一份长原创 2017-09-22 17:39:50 · 1040 阅读 · 1 评论 -
Lua 闭包 和upvalue
一、基本概念线程的所有打开upvalue(在堆栈上的upvalue) 都存放在L->openupvalue 当前函数的upvalue 的位置有两种情况:是父函数的local变量是父函数的upvalue变量二、闭包创建:是父函数的upvalue时,那么只需要引用父函数upvalue。是父函数的local变量 那么现在L->openupvalue 找,找到就引用。找不到创建一个连接到...原创 2018-03-02 14:36:25 · 740 阅读 · 0 评论 -
Lua GC 垃圾回收
GC原理:http://blog.csdn.net/yuanlin2008/article/details/8558103 https://blog.codingnow.com/2011/03/lua_gc_1.htmlluaC_fullgc :进行一次完整的gc总体上分为两部分(1)完成上次未完成GC(2)重新开始一次完整GC。因为在(2)中会进行完整GC,在(1)部中并不需要真...原创 2018-03-05 17:56:58 · 2788 阅读 · 0 评论 -
Luajit 概述
一、JIT即时编译器JIT:即时编译器。将频繁执行的代码,通过JIT编译器编译成机器码缓存起来,下次再调用时直接执行机器码。相比与原生Lua的逐条执行虚拟机指令效率更高。对于那些只执行一次的代码,则保持于原生Lua一样,逐条执行。JIT带来的效率提升,并不一定能抵消编译效率的下降。当虚拟机执行指令时并不会立刻用JIT进行编译。只有部分指令需要JIT进行编译,JIT将决定那些代码将被编译。延迟编译有...原创 2018-06-21 19:50:46 · 4066 阅读 · 1 评论 -
Lua GC 控制 gcstepmul 和 gcpause
Lua gc 是分步进行的,什么时候开始做呢??通过GCthreshold控制GC开始时机,GCthreshold就是触发GC的边界值。当一轮GC完整的完成后,GCthreshold 被设置成当前estimate的 gcpause / 100倍。estimate是剔除了userdata后的内存。带_gc元方法的userdata在第一次被处理时只调用_gc元方法,第二次才是真正回收。在分配新内存...原创 2018-12-28 15:57:22 · 3711 阅读 · 0 评论 -
C“控制”Lua
前言写过Windows程序的人都知道,对于应用程序,如果需要在本地保存一些配置信息,我们经常将这些配置信息写在注册表或者本地的配置文件中,很多应用都是将一些配置信息写在配置文件中,比如以ini结尾的文件,这种配置文件很多,使用的很广泛,然后应用程序在启动的时候,就会解析这个配置文件,读取一些配置信息。Lua的一项重要用途就是作为一种配置语言。而这篇文章将结合Lua来扩展应用程序,这转载 2017-04-06 20:46:33 · 187 阅读 · 0 评论 -
Lua与C
Lua语言是一种嵌入式语言,它本身的威力有限;当Lua遇见了C,那它就展示了它的强大威力。C和Lua是可以相互调用的。第一种情况是,C语言拥有控制权,Lua是一个库,这种形式中的C代码称为“应用程序代码”;第二种情况是,Lua拥有控制权,C语言是一个库,这个时候C代码就是“库代码”。“应用程序代码”和“库代码”都使用同样的API来与Lua通信,这些API就称为C API。C API是一组能转载 2017-04-06 20:08:17 · 385 阅读 · 0 评论 -
tolua++实现分析
.tolua++如何将c++对象导入到lua里tolua++为每一个传入lua的对象建立一个userdata,userdata的值,是c++对象的地址。userdata的metatable,是一个tolua++建立的,记录了userdata对应c++类型信息的表格,包括导出的成员变量、成员函数等信息。对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个转载 2016-08-04 10:51:35 · 399 阅读 · 0 评论 -
使用tolua++实现C++与LUA相互调用
使用tolua++实现C++与LUA相互调用LUA是一种目前很流行的高效精简的脚本语言。LUA一个特点是比较方便的与C通讯。然而要在脚本中使用C++类使用基本的LUA方法还是比较麻烦,纯手工暴露一个类的接口到LUA工作量还是很大的,而且都是一些简单的重复劳动。好在有tolua++这个工具,可以让程序员从简单的重复劳动解脱出来。tolua++包含两个部分,一个EXE,转载 2016-08-04 10:41:01 · 6768 阅读 · 1 评论 -
tolua++ lib 和 exe的生成
1.下载lua 和 tolua++ 源码 2.将lua代码编译成静态库3.用src/lib目录下的文件建立一个lib工程,这个工程需要引用lua5.1.4的头文件。编译后得到tolua.lib文件4.用src/bin目录下的文件建立一个exe工程,这个工程需要引用lua5.1.4的头文件和lib 生成exe文件转载 2016-08-02 17:12:47 · 1220 阅读 · 0 评论 -
Lua常用函数
lua_getallocflua_Alloc lua_getallocf (lua_State *L, void **ud);返回给定状态机的内存分配器函数。如果 ud 不是 NULL ,Lua 把调用lua_newstate 时传入的那个指针放入*ud 。lua_getfenvvoid lua_getfenv (lua_State *L, int index);把转载 2016-08-02 11:18:18 · 462 阅读 · 0 评论 -
Lua栈操作
理解Lua栈Lua通过一个“虚拟栈”与C/C++程序进行数据交互,所有的Lua C API都是通过操作这个栈来完成相应的数据通信。Lua的这个“虚拟栈”解决了C/C++程序与Lua程序通信的两大问题:Lua使用垃圾回收,而C/C++需要手动管理内存。Lua使用动态类型,而C/C++使用的是静态类型。因 为这个栈在Lua虚拟机内部,当一个Lua的变转载 2016-08-01 17:44:12 · 330 阅读 · 0 评论 -
Cocos2d-x之LUA脚本引擎深入分析
Cocos2d-x之LUA脚本引擎深入分析 另:本章所用Cocos2d-x版本为:Cocos2d-2.0.2http://cn.cocos2d-x.org/download 大家好,又是一周过去了,这一周忙的有点焦头烂额,除了工作照例每天加班到九点外,工具箱又做了大幅改进,新的论坛游戏兔子game2z也上线了,Cocos2d-x的学习时间被压缩转载 2016-08-01 14:30:49 · 857 阅读 · 1 评论 -
如何封装c++的指针
1 如何封装c++的指针 对于c++对象的lua包装,我们可以使用 template struct luaUserdataWrapper { luaUserdataWrapper() {} luaUserdataWrapper(const T& d) : data(d) {} T data; };class CObject{public:转载 2016-08-04 16:54:50 · 395 阅读 · 0 评论 -
Lua4虚拟机运行概述
Lua4虚拟机运行概述 概述 Lua是一种比较轻巧而且快捷的脚本语句,语法简单,但应用很广,很容易扩展。这里主要研究下Lua的原理与实现。我选取Lua4版本是因为Lua4简单一些,Lua5加了许多新特征,比如Metatable、Coroutine、尾调用、泛型for等,寄存器等分析起来会复杂一些,所以这里先从简单的入手。还是就是我的工作跟Lua4打的交道会多一些。转载 2016-09-07 14:28:27 · 651 阅读 · 0 评论 -
Lua中的闭包
前言在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结。希望对大家学习Lua有帮助。什么是闭包?闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体。我们再来看一段代码:function newCounter() local i = 0 return function () -- 匿名函数转载 2017-04-07 16:14:45 · 395 阅读 · 0 评论 -
Lua“控制”C
前言你现在看到了这篇文章,至少说明了你也在学习Lua语言。因为工作需要?因为Lua好玩?不管什么原因,总之Lua是一门很NB的脚本语言。其实,Lua语言本身是一个功能非常有限,而比较单调的语言,而且标准库也非常的平庸,它的NB之处就在于,它能和C、C++等高级语言完美“私通”。我们可以使用C、C++语言去给Lua写一个完美的库,让Lua调用。而这里,我就要好好的总结一下,如何让Lua来“控转载 2017-04-07 17:18:45 · 687 阅读 · 0 评论 -
Lua中的模块与包
Lua中的模块与包2014-08-02 分类:Lua 阅读(4005)评论(34) 前言从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包。require用于使用模块,module用于创建模块。简单的说,一个模块就是一个程序库,可以通过require来加载。然后便得到了一个全局变量,表示一个table。这个table就像转载 2017-04-06 16:57:26 · 404 阅读 · 0 评论 -
Lua GC 对数据类型的特殊处理
luaC_barrierback和luaC_barrierf 区别在GC过程中对新建的对象引用关系进行处理。例如:o 引用 vluaC_barrierf : 扫描阶段将v重新标记(V加入到当前GC),否则将o标记为whiteluaC_barrierback:将o加入到grayagain中。grayagain在原子操作中进行处理 luaC_barrierback用于监控table的key...原创 2018-12-29 11:07:33 · 488 阅读 · 0 评论