如何在 C++ 和 Lua 之间传递大型结构体

我正在考虑将 Lua 嵌入到我正在开发的 C++ 应用程序中。我想使用 Lua 来脚本化某些给定输入的操作顺序,即在 c++ 程序中接收新工作项,将细节传递给 Lua 后端,Lua 回调 c++ 来执行必要的工作,返回完成的结果。

涉及的主要数据结构是一个很大的(大约有 80 个成员)结构体。我对 Lua 很新,不确定如何在主机应用程序和嵌入式 Lua 状态之间传递它。

到目前为止,我发现我的选项有:

a)在 C++ 和 Lua 之间推送/弹出所有单独的数据成员(听起来有点混乱)。

b)构建一个表并填充值,然后将其放入/移出堆栈(稍微清晰一些)。

c)将其传递为userdata(轻量级/重量级?)(我对此有点模糊,并不确定/如何从 Lua 侧访问它以查询必要的操作)。

任何指导将不胜感激。

原文链接 https://stackoverflow.com/questions/283042

点赞
stackoverflow用户28169
stackoverflow用户28169

我自己没有做过这件事情(好几年没用Lua了,而且我从来没有以嵌入的方式使用过),但我认为你应该研究一下元表和用户数据类型。手册上对用户数据值的说明是:

这种类型对应于原始内存块,在Lua中没有预定义操作,除了赋值和身份测试。但是,通过使用元表,程序员可以为用户数据值定义操作(请参阅§2.8)。用户数据值无法在Lua中创建或修改,只能通过C API进行

听起来还不错。

2008-11-12 07:33:09
stackoverflow用户15459
stackoverflow用户15459

如果我没记错的话,轻量级用户数据其实就是一个指针。它们都共享同一个元表。它们通常用于传递 C 数据的地址。

如果你必须从 Lua 端访问它,完整的用户数据可能更适合你。它们的元表会让你像访问普通的 Lua 表一样访问它。

你也可能会对罗伯托的 用于将数据从 C 结构体转换到 Lua 5.1 的库 感兴趣。或者不感兴趣也行,取决于你的需求。 :-)

2008-11-12 11:00:48
stackoverflow用户41661
stackoverflow用户41661

暴露整个数据结构给 Lua 可能不是您想要的。也许您只想暴露一些操作?那么请使用指向结构体的指针作为轻量级用户数据。它不能有元表,因此您必须使用显式函数。

如果您想要暴露所有内容,最好的选择可能是推送一个仅包含指向结构体指针的完整用户数据。这意味着多了一层间接性 - 从性能角度来看,噪声中丢失了,但很容易出错,因此请在跨越 C++/Lua 边界的地方保持单一真相。

使用完整的用户数据,您可以使用宏(可怕!)为每个字段放置 getter 和 setter 函数。手动完成这项工作需要很多工作,您可能更喜欢使用 tolua++,尽管它带有很多麻烦。

去 Lua 邮件列表!

2008-11-28 21:02:15
stackoverflow用户21133
stackoverflow用户21133

如果我是你,我会传递一个指向结构体的引用,然后让 Lua 调用 C 函数来修改它。这也意味着你可以更轻松地升级系统,而不需要 Lua 知道底层系统的所有细节。

2009-07-22 05:57:49