c++ - 具有轻型用户数据和引用的 Lua 注册表有什么区别?

标签 c++ c lua lua-api lua-c++-connection

因此,使用 Lua C API,您可以在注册表中保存一个 Lua 值并在以后检索它。有不同的方法可以做到这一点,您可以创建一个变量并将其指针用作注册表中的键,因为它始终是唯一的。您会将指针作为轻型用户数据推送。

您还可以使用 LuaL_ref(L, LUA_REGISTRYINDEX) 创建引用。一个比另一个有什么优势?什么时候用引用,什么时候用指针?

还有引用,因为它被称为引用,如果Lua垃圾收集器收集了Lua值,注册表中的值是否为nil?如果Lua更新了Lua值,注册表中的值是否也会改变?

最佳答案

Lua 注册表只是另一个 lua 表,可以通过预定义的“特殊”索引轻松访问。我想您不需要解释 Lua 表与轻型用户数据有何不同。
只要您可以将该键存储在 C/C++ 端,您将如何索引注册表并不重要。为了您的方便,已经有函数 (luaL_ref/luaL_unref) 为您提供易于存储和移动的整数键。

关于垃圾回收——规则总是一样的。只要值存储在未标记为弱表的表中(注册表不是弱表),该值就不会被清除。您必须明确地从注册表中删除值。

改变值将遵循正常的 Lua 规则。为某些变量分配新的不可变值不会更改存储在注册表中的值,即注册表不会跟随某些变量的更新。但是更改可变值(表等)的内容是可以的,因为注册表和变量将引用相同的值。

关于c++ - 具有轻型用户数据和引用的 Lua 注册表有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40189648/

相关文章:

c++ - 乱七八糟的是ctime、time.h、sys/time.h

c++ - 初学者 C++ - 字符串比较

c - 我如何限制以十进制显示的二进制到二进制转换器?

interface - 简单的 WoW 界面插件不起作用(Lua)

lua - 如何在一个表达式中比较具有多个返回值的两个函数的结果?

c++ - CRTP 编译,但我不希望它编译。如何?

c++ - 使用 <set> 运算符调用 void 函数时出错

c - 在 Code::Blocks 中链接静态系统库 libm.a

c - 将指向结构的指针设置为等于函数返回的另一个指向结构的指针?

iphone - iPhone 上的 2D Lua 游戏