皮皮网

【html5源码包】【直播系统源码免费】【荒野行动方框源码】lua pushstring 源码

来源:gcc 源码下载 时间:2024-12-23 00:02:33

1.如何在 Lua 注册表中选择一个合适的 Key
2.Unlua源码解析(附) 读源码的前置知识

lua pushstring 源码

如何在 Lua 注册表中选择一个合适的 Key

       为了让各个 C 扩展库之间可以相安无事的工作,并且对注册表的操作又有较高效率。Lua 大神 Roberto 在神作Pil里给出了一个简洁的方案:用 static 变量的地址作为 key。静态变量在当前进程中一定拥有惟一的地址,且 lightuserdata 作 key 非常高效。这无疑是html5源码包一个好方法。但是,当模块的源码规模变大了以后,我们将代码分散到不同的源文件中。或者几个子模块需要相互协作时。这个方法就有了一定的缺陷。那就是直播系统源码免费,必须将这个静态变量暴露出来供大家蹂躏;或是写一个内部函数来取得它(其实没有本质区别)。如果你也碰到这类问题,不妨看看下面的解决方案。我们可以在子模块间约定一个字符串,比如 "foobar" 。如果能保证字符串惟一,直接用这个字符串做 key 当然也可以。不过效率稍微低了一点。(字符串压栈要多做一次 hash)。但是 lua 的虚拟机可以保证,只要字符串还有人引用,荒野行动方框源码那么字符串对象就永远只有一份放在内存中,且不会被移动。所以,只要保证这个字符串从未被回收,lua_tostring的结果就永远是一致的。明白了吗?每个子模块只要在初始化的时候,顺着调用:lua_pushstring(L,"foobar");key=lua_tostring(L,-1);就可以保证得到的 key 是惟一地址了。当然,你依然得谨慎选择字符串防止冲突。并且要自己在一个绝对安全的地方对这个字符串做至少一次引用。

Unlua源码解析(附) 读源码的蜘蛛词软件源码前置知识

       在解析Unlua源码时,需要熟悉Lua的基本API和交互机制。以下为关键API及功能解析:

       1. lua_getfield(L, k):获取指定表中由key k指向的值,压入栈顶。

       2. lua_gettop(L):返回栈顶元素的索引,即栈的大小。

       3. lua_rawget(L, -2):与lua_getfield类似,获取t[k]的值压入栈顶,但不调用元方法。

       4. lua_rawset(L, -4):设置t[k] = v,同样不通过元方法。

       5. lua_remove(L,邮箱发送网页源码 -2):移除栈中index为-2的内容,之后所有元素下移。

       6. Lua与C++交互机制:调用开始时,Lua参数依次压入栈;调用结束时,C++返回值压入栈,同时返回值数量。

       在lua.h中,lua与C交互的API如下:

       1.1 lua_register:将C函数设置为全局名称的新值,允许Lua端调用。

       1.2 lua_gettop:返回栈顶元素的索引,用于获取栈大小。

       1.3 lua_pop:弹出栈中指定数量的值。

       1.4 lua_tolstring:将指定位置的值转换为C字符串,并返回字符串长度。

       1.5 lua_tostring:与lua_tolstring类似,但返回长度为NULL。

       1.6 lua_getfield:将表中key指向的值压入栈顶。

       1.7 luaL_getmetatable:获取指定表的元表并入栈。

       1.8 luaL_newmetatable:创建新元表并入栈,或重用已有。

       1.9 lua_getmetatable:获取指定索引处的表的元表。

       1. lua_pushstring:将字符串入栈,Lua会做拷贝。

       1. lua_settable:设置表中key对应的值。

       1. lua_rawset:与lua_settable类似,不调用元方法。

       1. lua_gettable:从表中获取key对应的值。

       1. lua_rawget:与lua_gettable类似,不调用元方法。

       1. lua_pushinteger:将数字入栈。

       1. lua_pushlightuserdata:将指针入栈。

       1. lua_pushcclosure:创建闭包入栈。

       1. lua_pushvalue:复制指定位置的值入栈。

       1. lua_setmetatable:设置表元表。

       1. lua_getglobal:获取全局变量并入栈。

       1. lua_setglobal:设置全局变量值。

       1. lua_pushnil:入栈nil值。

       1. lua_upvalueindex:获取闭包中的upvalue。

       1. lua_touserdata:返回完整 userdata 或 light userdata 指针。

       1. lua_newtable:创建空表并入栈。

       1. lua_createtable:预分配空间后创建空表。

       1. lua_next:用于遍历表元素。

       1. lua_tolstring:将指定位置的值转换为C字符串。

       1. lua_tostring:与lua_tolstring类似,但不返回长度。

       1. lua_newuserdata:分配内存并创建 userdata。

       1. lua_call:调用Lua函数。

       1. lua_pcall:与lua_call类似,用于调用Lua函数。

       在Lua中,存在一些全局方法如rawset和rawget,用于直接写入或读取表元素而避免元方法的调用。

       综上所述,通过掌握这些API,开发者能有效利用Lua与C++的交互机制,实现复杂、高效的数据处理和逻辑交互。