假设我有一个C程序想要用两个字符串调用一个非常简单的Lua函数(假设两个逗号分隔的列表,如果列表完全相交则返回true,否则返回false)。
显而易见的方法是使用lua_pushstring将它们推送到堆栈上,但是,从文档看起来像lua_pushstring可以正常工作,但是为Lua创建了一个字符串副本。< / p>
这意味着要交叉到Lua函数将需要两个字符串副本,我可以通过重写C中的Lua函数来避免。有没有办法安排事情,以便现有的C字符串可以在Lua方面是为了表现(或者说,无论如何,strcpy的成本都会变得无足轻重)?
到目前为止我的调查(我的前几个小时认真看待Lua),lite userdata似乎是我想要的东西,但是以字符串的形式。
答案 0 :(得分:6)
没有。当你致电lua_pushstring()
时,你不能禁止Lua复制字符串。
原因:除非,内部garbage collector无法释放未使用的内存(例如您的2个输入字符串)。
即使你使用了轻量级用户数据功能(在这种情况下这也是一种过度杀伤),当Lua程序要求输入字符串时,你必须稍后使用lua_pushstring()
。
答案 1 :(得分:1)
嗯..你当然可以编写一些C函数,以便在C端完成工作,但正如另一个答案所指出的那样,你可能会因此无法推动字符串或其中的部分。
值得注意的是:Lua只会在它们被引入时存储一次字符串。即:如果我有1个包含“快速棕色狐狸跳过懒狗”的字符串并将其推入Lua,并且没有其他字符串对象包含该字符串,它将创建它的新副本。另一方面,如果我已经插入它,你只需要指向第一个字符串的指针,所以相等检查非常便宜。如果这是以高频率进行的话,导入这些字符串可能有点贵,但是比较再次便宜。
我会尝试分析您正在实施的内容,看看效果是否符合您的期望。
作为Lua Performance Tips文档(如果您考虑使用Lua最大化性能,我建议阅读),与优化相关的两个编程格言是:
规则#1:不要这样做。
规则#2:不要这样做。 (仅限专家)