Lua协程、GC垃圾回收机制以及如何调用C/C++函数

本文介绍了Lua的协程、垃圾回收机制以及如何从Lua中调用C/C++函数。Lua协程允许线程间的协作而非并发执行,垃圾回收器采用增量标记-扫描收集策略,而调用C/C++函数则涉及到堆栈操作和动态链接库的使用。

Lua 协程(coroutine)

线程和协同程序区别与联系

相同之处:Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

不同之处:一个多线程程序可以同时运行几个线程(并发执行、抢占),而协程却需要彼此协作地运行,并非真正的多线程,即一个多协程程序在同一时间只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占、无并发)。注意:由于Lua中的协程无法在外部将其停止,而且有可能导致程序阻塞;


Lua GC垃圾回收机制

Lua 采用了自动内存管理。 这意味着你不用操心新创建的对象需要的内存如何分配出来, 也不用考虑在对象不再被使用后怎样释放它们所占用的内存。

Lua 运行了一个垃圾收集器来收集所有死对象 (即在 Lua 中不可能再访问到的对象)来完成自动内存管理的工作。 Lua 中所有用到的内存,如:字符串、表、用户数据、函数、线程、 内部结构等,都服从自动管理。

Lua 实现了一个增量标记-扫描收集器。 它使用这两个数字来控制垃圾收集循环: 垃圾收集器间歇率和垃圾收集器步进倍率。 这两个数字都使用百分数为单位 (例如:值 100 在内部表示 1 )。

垃圾收集器间歇率控制着收集器需要在开启新的循环前要等待多久。 增大这个值会减少收集器的积极性。 当这个值比 100 小的时候,收集器在开启新的循环前不会有等待。 设置这个值为 200 就会让收集器等到总内存使用量达到 之前的两倍时才开始新的循环。

垃圾收集器暂停时间
该数值被用于控制垃圾收集器被 Lua 自动内存管理再次运行之前需要的等待时长。当其小于 100 时意味着收集器在新周期开始前不再等待。其值越大垃圾回收器被运行的频率越低,越不主动。当其值 200 时,收集器在总使用内存数量达到上次垃圾收集时的两倍时再开启新的收集周期。因此,根据程序不同的特征,可以通过修改该值使得程序达到最佳的性能。

垃圾收集器步长倍增器
步长倍增器用于控制了垃圾收集器相对内存分配的速度。数值越大收集器工作越主动,但同时也增加了垃圾收集每次迭代步长的大小。值小于 100 可能会导致垃圾器一个周期永远不能结束,建议不要这么设置。默认值为 200,表示垃圾收集器运行的速率是内存分配的两倍。


C/C++调用lua实现原理

现在有很多的高级程序员,习惯性地运用封装代码的形式来将C++调用lua给封装在类的内部,但是万变不离其宗,最终都是在底层还是通过操作堆栈实现的,操作堆栈简单的说就是出栈和入栈。lua堆栈支持多种数据格式压栈,例如数字(包括int、float 和double)、字符串、表、实例对象等等,实例对象我们也可以称作闭包或者黑包,当然也能将函数压入堆栈进行调用。

其实C++调用lua脚本,我们可以很形象的认为lua程序是一个模块,而往往我们在调用的时候是以文件的形式展开的,所以往往调用之前务必要加载lua程序文件。lua提供了接口供外部加载自身。


Lua中调用C/C++函数 

Lua中调用C函数

在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型:

typedef int (*lua_CFunction) (lua_State *L);

lua中调用C++函数

将C++函数编译成动态链接库,然后在lua中require;


参考:

Lua 协程(coroutine)

深入理解lua的协程coroutine

Lua 垃圾回收机制

C/C++调用lua实现原理

Lua中调用C/C++函数 (转)

Lua 教程


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独立游戏开发指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值