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

use*_*108 5 c c++ lua

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

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

lua_Object o(...some lua call...);
lua_pushobject(o);
Run Code Online (Sandbox Code Playgroud)

但是,如上所述,这是不可能的.那么,如何将lua对象(特别是大型表,重建速度很慢)存储然后快速存储到lua堆栈中?我知道注册表,但这只是另一个表,如果我从那里存储/检索,则不会避免哈希计算.

编辑:

一些细节:

lua包装器库的一个众所周知的问题是临时表问题.说我打电话:

control:camera():get_something_else()
Run Code Online (Sandbox Code Playgroud)

control带有CFunction的表(包装的C++对象)在哪里.camera每次调用该方法时,该方法都将返回一个表(另一个包装的C++对象).如果我们可以缓存这个表,那将是很好的,因此每次都不需要重新创建它,因为时间是关键的(出于性能原因我们使用C/C++).此外,我们不希望从另一个表中查找表,因为这意味着计算某个键的散列(比如包装的C++对象的实例转换为整数),以及其他查找成本.我的目标是最新lua版本5.2.

Kam*_*olo 2

实际上,推送和对象时并没有计算哈希值。添加或删除元素时表会重新哈希

看着lobject.h:

#define setobj(L,obj1,obj2) \
 { const TValue *o2=(obj2); TValue *o1=(obj1); \
   o1->value = o2->value; o1->tt=o2->tt; \
     checkliveness(G(L),o1); }
Run Code Online (Sandbox Code Playgroud)

如果您已填充Table对象 ( lobject.h),您可以轻松复制它们并用它们填充不同的 Lua 虚拟机。宏(从相同的lobject.h设置TValue值到您的Table:

#define sethvalue(L,obj,x) \
  { TValue *i_o=(obj); \
    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \
      checkliveness(G(L),i_o); }
Run Code Online (Sandbox Code Playgroud)

唯一的事情...你将把公共 Lua C Api 的边界抛在后面...:)

您可能还需要检查ltable.c和lstate.h。也许稍后会尝试制作一个正确的代码示例......

编辑:另外,如果您想显着减少重新哈希计数,请改用lua_createtable(lua_State *L, int narr, int nrec);...:)