所有非本地 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/