关于C#:避免在Lua中复制字符串

Avoiding string copying in Lua

假设我有一个C程序想要用两个字符串调用一个非常简单的Lua函数(假设两个逗号分隔的列表,如果列表完全相交则返回true,否则返回false)。

这样做的显而易见的方法是使用lua_pushstring将它们推入堆栈,这很好用,但是,从文档来看,它看起来像lua_pushstring,但为Lua使用了该字符串的副本。

这意味着要过渡到Lua函数将需要两个字符串副本,而我可以通过用C重写Lua函数来避免。这有什么方法可以安排,以便现有的C字符串可以在Lua端重用。 是为了性能(还是strcpy的成本会变得微不足道)?

从到目前为止的调查(我的前几个小时认真研究Lua)来看,精简的用户数据似乎是我想要的那种东西,但是形式是字符串。


不。您不能禁止Lua在调用lua_pushstring()时复制字符串。

原因:除非内部垃圾回收器无法释放未使用的内存(例如您的2个输入字符串)。

即使您使用了轻量级的用户数据功能(在这种情况下,这也是一个过大的功能),当Lua程序要求输入字符串时,您以后也必须使用lua_pushstring()


嗯。您当然可以编写一些C函数,以便在C端完成工作,但是正如其他答案所指出的,无论如何,您可能会陷入推入字符串或字符串部分的麻烦。

值得注意的是:Lua引入时仅存储一次字符串。即:如果我有1个包含"快速的棕色狐狸跳过懒狗"的字符串,然后将其推入Lua,并且没有其他包含该字符串的字符串对象字符串,它将创建一个新副本。另一方面,如果我已经插入了它,那么您将只获得指向第一个字符串的指针,因此进行相等性检查非常便宜。我想,如果以很高的频率导入这些字符串可能会有点昂贵,但是再次比较却很便宜。

我将尝试剖析您正在实施的内容,并查看性能是否达到您的期望。

作为Lua Performance Tips文档(如果您正在考虑使用Lua最大化性能,我建议阅读),与优化相关的两个编程准则是:

规则1:不要这样做。

规则2:不要这样做。 (仅适用于专家)