lua的注册表,_ENV,_G

本文探讨了Lua中的全局表_G和_ENV,指出两者在lua52中具有相同的效果,展示了_LUA_RIDX_GLOBALS如何在注册表中初始化全局表,并详细解释了luaopen_base函数如何将基础函数注册到_G。同时,文章揭示了_ENV的设置过程,通过lua_load函数关联注册表、全局表与_ENV的关系。
摘要由CSDN通过智能技术生成

之前读书的时候,比较喜欢玩python,对于lua,就知道专门用来做游戏脚本的,一直没机会接触到。

有幸的是,今年进入了一个新项目,用到了lua.我做事不喜欢不明不白,所以在使用lua过程中遇到不明一般都喜欢看源码探其原由。

lua51和lua52都有一个叫全局表_G,遍历这个表就可以知道,这个表保存了lua所有的全局函数和全局变量。

而到了lua52,有个叫_ENV的玩意,遍历这个表也知道,也得到跟_G一样的结果.

先看看这个_G是如何产生的。

在lua中,多个lua state会共享一个global state,在通过luaL_newstate()产生lua state而后初始化的过程中,在f_luaopen这个函数会调用init_registry初始化一个叫注册表的玩意.

如下,调用栈:

 	test.exe!init_registry(lua_State * L, global_State * g)  行 168	C
 	test.exe!f_luaopen(lua_State * L, void * ud)  行 187 + 0xd 字节	C
 	test.exe!luaD_rawrunprotected(lua_State * L, void (lua_State *, void *)* f, void * ud)  行 133 + 0x1f 字节	C
 	test.exe!lua_newstate(void * (void *, void *, unsigned int, unsigned int)* f, void * ud)  行 304 + 0x10 字节	C
 	tes
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值