【Lua】Lua底层原理

文章探讨了Lua的数据结构和内存占用,特别是其与C的交互机制,通过虚拟栈进行数据传递。同时,重点介绍了Lua的垃圾回收(GC)机制,采用三色标记清除算法,将对象状态分为白色(可回收)、灰色(待标记)和黑色(已标记)。GC过程包括初始化、标记和回收三个阶段,确保有效管理内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 相关底层原理参考

如何深入理解Lua数据结构和内存占用?
【Lua源码赏析】第四章 Table 的实现


2. C 和 Lua 的交互原理

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

参考文章:
Lua和C++交互详细总结【转载】

3. Lua GC

三色标记清除算法:
白色:可回收状态

如果该对象未被GC标记过则此时白色代表当前对象为待访问状态。举例:新创建的对象的初始状态就应该被设定为白色,因为该对象还没有被GC标记到,所以保持初始状态颜色不变,仍然为白色。如果该对象在GC标记阶段结束后,仍然为白色则此时白色代表当前对象为可回收状态。但其实本质上白色的设定就是为了标识可回收。

灰色:中间状态

当前对象为待标记状态。举例:当前对象已经被GC访问过,但是该对象引用的其他对象还没有被标记。

黑色:不可回收状态

当前对象为已标记状态。举例:当前对象已经被GC访问过,并且对象引用的其他对象也被标记了。

每个新创建的对象颜色设置为白色

//初始化阶段
遍历root节点中引用的对象,从白色置为灰色,并且放入到灰色节点列表中

//标记阶段
while(灰色链表中还有未扫描的元素):
	从中取出一个对象,将其置为黑色.

	遍历这个对象关联的其他所有对象:
		if 为白色
			标记为灰色,加入到灰色链表中(insert to the head)

//回收阶段
遍历所有对象:
	if 为白色,
		没有被引用的对象,执行回收
	else
		重新塞入到对象链表中,等待下一轮GC

文章参考:
lua的GC原理
Lua设计与实现–GC篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值