如何在 C++ 和 Lua 之间传递大型结构体
我正在考虑将 Lua 嵌入到我正在开发的 C++ 应用程序中。我想使用 Lua 来脚本化某些给定输入的操作顺序,即在 c++ 程序中接收新工作项,将细节传递给 Lua 后端,Lua 回调 c++ 来执行必要的工作,返回完成的结果。
涉及的主要数据结构是一个很大的(大约有 80 个成员)结构体。我对 Lua 很新,不确定如何在主机应用程序和嵌入式 Lua 状态之间传递它。
到目前为止,我发现我的选项有:
a)在 C++ 和 Lua 之间推送/弹出所有单独的数据成员(听起来有点混乱)。
b)构建一个表并填充值,然后将其放入/移出堆栈(稍微清晰一些)。
c)将其传递为userdata(轻量级/重量级?)(我对此有点模糊,并不确定/如何从 Lua 侧访问它以查询必要的操作)。
任何指导将不胜感激。
原文链接 https://stackoverflow.com/questions/283042
如果我没记错的话,轻量级用户数据其实就是一个指针。它们都共享同一个元表。它们通常用于传递 C 数据的地址。
如果你必须从 Lua 端访问它,完整的用户数据可能更适合你。它们的元表会让你像访问普通的 Lua 表一样访问它。
你也可能会对罗伯托的 用于将数据从 C 结构体转换到 Lua 5.1 的库 感兴趣。或者不感兴趣也行,取决于你的需求。 :-)
暴露整个数据结构给 Lua 可能不是您想要的。也许您只想暴露一些操作?那么请使用指向结构体的指针作为轻量级用户数据。它不能有元表,因此您必须使用显式函数。
如果您想要暴露所有内容,最好的选择可能是推送一个仅包含指向结构体指针的完整用户数据。这意味着多了一层间接性 - 从性能角度来看,噪声中丢失了,但很容易出错,因此请在跨越 C++/Lua 边界的地方保持单一真相。
使用完整的用户数据,您可以使用宏(可怕!)为每个字段放置 getter 和 setter 函数。手动完成这项工作需要很多工作,您可能更喜欢使用 tolua++,尽管它带有很多麻烦。
去 Lua 邮件列表!
如果我是你,我会传递一个指向结构体的引用,然后让 Lua 调用 C 函数来修改它。这也意味着你可以更轻松地升级系统,而不需要 Lua 知道底层系统的所有细节。
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
- 如何创建一个 lua 脚本以针对特定键为 fluentbit 进行限流
我自己没有做过这件事情(好几年没用Lua了,而且我从来没有以嵌入的方式使用过),但我认为你应该研究一下元表和用户数据类型。手册上对用户数据值的说明是:
听起来还不错。