当前位置: 首页 > news >正文

Lua C API 中的注册表介绍

原文地址:Lua C API 中的注册表介绍

欢迎参观我的网站:无敌牛 – 技术/著作/典籍/分享等

在 Lua 的 C API 中,有一个特殊的表,叫做 注册表(Registry)。它不是 Lua 脚本中能直接访问的普通表,而是专为 C 代码设计的全局存储区


一、注册表是什么?

  • 注册表是一个普通的 Lua 表,但只有 C 代码能访问。
  • 它的“地址”是固定的:使用伪索引 LUA_REGISTRYINDEX(值为 -10000)。
  • Lua 脚本中没有变量指向它,因此脚本无法直接读写它。
  • 它的生命周期和 Lua 状态机(lua_State* L)一致 —— 只要 L 存在,注册表就存在。
  • 所以,注册表不是 _G(全局表)

二、为什么需要注册表?

当你在 C 中调用 Lua,有时需要:

  • 保存一个 Lua 函数,以后回调它(比如事件处理函数)
  • 保存一个 Lua 表或 userdata,避免被垃圾回收
  • 在多个 C 函数之间传递 Lua 对象

直接保存 lua_State* 和栈位置是不安全的 —— 栈会变,对象可能被 GC。
注册表提供了一个安全、稳定、长期存储 Lua 值的地方


三、怎么使用注册表?

最常用、最安全的方式是配合 luaL_refluaL_unref

1. 保存值 → 获取引用编号

lua_pushvalue(L, idx);        // 把你想保存的值推到栈顶
int ref = luaL_ref(L, LUA_REGISTRYINDEX);  // 存入注册表,返回整数引用

2. 取回值

lua_rawgeti(L, LUA_REGISTRYINDEX, ref);  // 把值重新压入栈顶

3. 释放值(重要!)

luaL_unref(L, LUA_REGISTRYINDEX, ref);   // 释放引用,避免内存泄漏

四、注意事项

  • 推荐只用 luaL_ref 返回的整数作为键 —— 这是安全区,不会和 Lua 内部冲突。
  • 避免用字符串键(如 "mydata")—— Lua 内部可能已占用某些键(如 "IO"),有冲突风险。
  • 用完一定要 luaL_unref —— 否则对象会一直留在注册表中,造成内存泄漏。

五、典型应用场景

  • 保存 Lua 回调函数供 C 触发
  • 在 C 结构体中存储 Lua 对象的“句柄”
  • 实现 C 与 Lua 之间的对象生命周期管理
  • 跨多个 C 函数共享 Lua 数据

六、总结

注册表是 Lua C API 中一个简单但非常实用的机制:

它让 C 代码能安全地“记住”Lua 中的对象,不怕栈变化,不怕 GC 回收。

使用方法也很简单:

luaL_ref → 保存,拿编号
lua_rawgeti → 取回
luaL_unref → 释放
http://www.dtcms.com/a/490512.html

相关文章:

  • 广州做网站哪家公司最好wordpress html调用php
  • 神经网络之计算图
  • Hatch 故障排除指南
  • 神经网络之计算图分支节点
  • 【表格对比分析】Java集合体系、Java并发编程、JVM核心知识、Golang go-zero微服务框架
  • 【任务管理软件】实用工具之ToDoList 9.0.6 详细图文安装教程:高效任务管理的完美起点
  • Linux中zonelist分配策略初始化
  • hadoop的三副本数据冗余策略
  • 岳阳网站建设企业足球比赛直播app下载
  • React 三元运算符页面切换:完整进出流程
  • NumPy zeros_like() 函数详解
  • 网站建设要后台吗公司网页制作哪家好
  • 天津网站建设优化网页设计图片代码
  • CXR SDK实战指南:跨设备AR应用开发
  • 已知明文攻击(Known plaintext):原理、方法与防御体系深度剖析
  • ​SPI四种工作模式
  • 深度学习------YOLOV1和YOLOV2
  • 最小二乘问题详解5:非线性最小二乘求解实例
  • 算法入门数学基础
  • 错误边界:用componentDidCatch筑起React崩溃防火墙
  • 网站备案提交管局原创软文
  • 成都比较好的网站建设公司视频制作和剪辑软件
  • 如何从电脑上卸载安卓应用程序
  • 每日手撕算法--哈希映射/链表存储数求和
  • k8s的pvc和pv
  • RK3562核心板/开发板RT-Linux系统实时性及硬件中断延迟测试
  • node.js把webp,gif格式图片转换成jpg格式图片
  • 不能识别adb/usb口记录
  • SpringBoot-常用注解
  • 支付商城网站制作软件开发报价表