c++ - 从 C/C++ 快速检索 lua 对象

标签 c++ c lua

所有非本地 lua 对象都存储在某个表中。从表中检索对象通常意味着首先对键进行哈希计算,然后检索相应的对象。我想避免哈希计算的额外步骤。

最简单的事情(曾经是可能的)是:

lua_Object o(...some lua call...);
lua_pushobject(o);

但是,如前所述,这已经不可能了。那么,我如何快速存储然后将 lua 对象(特别是一个大表,重新创建它会很慢)推送到 lua 堆栈上?我知道注册表,但那只是另一个表,如果我从那里存储/检索,则无法避免哈希计算。

编辑:

一些细节:

lua 包装库的一个众所周知的问题是临时表问题。假设我打电话:

control:camera():get_something_else()

其中 control 是一个带有 CFunctions 的表(包装的 C++ 对象)。 camera 方法每次被调用时都会返回一个表(另一个包装的 C++ 对象)。如果我们可以缓存这个表,那就太好了,这样就不需要每次都重新创建,因为时间很紧迫(出于性能原因,我们使用 C/C++)。此外,我们不想从另一个表中查找该表,因为这意味着计算某些键的哈希值(比如将包装的 C++ 对象的实例转换为整数),以及其他查找成本。我的目标是最新的 lua 5.2 版本。

最佳答案

我已经用一个可以缓存 CFunction 结果的上值解决了这个问题;这包括一张 table 。 CFunction 可以检查上值中是否已经存在非零值。如果是这样,它只能重用现有的(上)值。访问上值不涉及任何冗长的查找。我不会接受这个答案,因为我最初问过这个问题并希望鼓励其他答案。

关于c++ - 从 C/C++ 快速检索 lua 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19831139/

相关文章:

c - 如何使用 C 程序读取和打印进入接口(interface)的 UDP 数据包的十六进制流?

c++ - 使用 Lua 从 C++ 修改 XML 字符串

c++ - 用于定义带有公开模板参数的模板结构的宏

c++ - 忽略 '#'之后的一切

c - 如何在函数之间更改指针值

parsing - 哪些语法可以使用递归下降而不回溯来解析?

ios - 如何在 iOS 中编辑来自另一个应用程序的文本

c++ - 使用 vector 还是数组?

c++ - 使用 std::for_each 遍历树

c - mount() 上的自动检测文件系统