【问题标题】:How to pass large struct back and forth between between C++ and Lua如何在 C++ 和 Lua 之间来回传递大型结构
【发布时间】:2010-09-21 22:25:22
【问题描述】:

我正在考虑将 Lua 嵌入到我正在开发的 C++ 应用程序中。我的意图是使用 Lua 编写脚本,为某些给定的输入执行哪些有序操作,即。 在 c++ 程序中接收一个新的工作项,将详细信息传递给 Lua 后端,Lua 回调到 c++ 中执行必要的工作,返回完成的结果。

涉及的主要数据结构是一个大型(大约 80 多个成员)struct。我(非常)是 Lua 新手,我不确定如何将它传入和传出我的主机应用程序和嵌入式 Lua 状态。

到目前为止,我认为我的选择是:

a) 在 C++ 和 Lua 之间进行交互时,将所有单独的数据成员推入/弹出堆栈(听起来很乱)。

b) 构造一个表并填充值,然后将其放入/退出堆栈(更简洁一些)。

c) 将其作为userdata 传递(轻/重?)(我对此很粗略,不确定是否/如何从 Lua 端访问它以查询哪些操作是必要的)。

任何指导将不胜感激。

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    如果我没记错的话,轻量级用户数据实际上只是一个指针。它们都共享相同的元表。它们主要用于传递 C 数据的地址。
    如果您必须从 Lua 端访问完整的用户数据,它可能更接近您的需要。例如,它们的元表将允许您像访问常规 Lua 表一样访问它。

    您可能还对 Roberto 的library for converting data to and from C structs for Lua 5.1 感兴趣。或不。取决于您的需求... :-)

    【讨论】:

    • 我能够将 lightuser 数据转换为 Objective-c 对象。我想它对结构也适用。
    【解决方案2】:

    我自己还没有这样做过(自从我使用 Lua 以来已经有好几年了,而且我从未以嵌入式方式使用过),但我认为您应该查看 metatables 和 userdata 类型。该手册对用户数据值进行了说明:

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

    听起来不错。

    【讨论】:

      【解决方案3】:

      将整个表示暴露给 Lua 可能不是您想要的。 也许你只暴露了几个操作?然后使用指向结构的指针作为轻用户数据。它不能有元表,所以你必须使用显式函数。

      如果您想公开所有内容,最好的办法可能是推送仅包含指向结构的指针的完整用户数据。这意味着额外的间接层级——从性能的角度来看,会迷失在噪音中,但很容易出错,所以在跨越 C++/Lua 边界的地方保持单一事实。

      有了完整的用户数据,您可以使用宏(太可怕了!)为每个字段设置 gettter 和 setter 函数。这需要手工完成很多工作,您可能更喜欢查看 tolua++,即使它带有很多包袱。

      转到 Lua 邮件列表!

      【讨论】:

        【解决方案4】:

        如果我在你的位置,我会传递一个对结构的引用,然后让 Lua 调用 C 函数来修改它。这也意味着与 Lua 必须了解底层系统的所有细节相比,您可以更轻松地升级系统。

        【讨论】:

          猜你喜欢
          • 2013-10-08
          • 1970-01-01
          • 2015-05-28
          • 1970-01-01
          • 1970-01-01
          • 2020-10-09
          • 2010-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多