除了之前的答案:
lightuserdata
Lua和Lua 的区别userdata
lightuserdata
是包含 C 指针的特殊 Lua 类型(以及nil
, boolean
, number
, string
, table
,等)。thread
而已。您不能将 metatable 分配给lightuserdata
. 相反,您可以将元表分配给userdata
类型。例如参见Lua 文件操作,其中文件句柄userdata
与方法一起使用。f:read("*all")
f 是userdata
命令相当于f.read(f, "*all")
LUA_REGISTRYINDEX
使用整数或 C 指针进行索引
有两种方法在注册表中被广泛使用。
创建对 Lua 值的新引用,luaL_ref
并将返回的整数值存储在代码中的某处。即,要访问 Lua 值,您需要读取包含引用和索引注册表的 C 变量,lua_rawgeti(L, LUA_REGISTRYINDEX, i)
其中该整数值在哪里。lua_rawseti(L, LUA_REGISTRYINDEX, i)
也可以,但不要尝试用这种方法重写为 nil 值!
您创建一个静态 C 变量static int myvar;
,然后直接使用lua_rawgetp(L, LUA_REGISTRYINDEX, &myvar)
和lua_rawsetp(L, LUA_REGISTRYINDEX, &myvar)
操作存储的 Lua 值。
不幸的是,我无法比较两种方法的性能。我认为它们几乎相同。