使用Luajit时,使用FFI还是普通的Lua绑定更好?

7

我刚开始使用C++和Luajit进行尝试,我发现它的FFI非常易于使用,但我不确定它是否是所有情况(或至少大多数情况)下的最佳解决方案。

那么,使用其中一个比另一个更好,还是只是个人喜好?

2个回答

13

正如LuaJIT网站所述,通过FFI绑定的C函数调用可以进行JIT编译(与通过Lua C / API调用相反),因此在性能方面FFI肯定更好。此外,使用FFI,您可以在Lua中使用本机C类型进行计算,在某些情况下可以进一步提高性能(例如)。

使用FFI时可能会遇到一个问题(如果您习惯于C / API),即当您想要一个C函数返回多个值时。在Lua C / API中,这很简单,但是在FFI的情况下,这需要一些技巧(例如为FFI C调用编写包装器函数)。但是我认为这是一个很小的缺点,考虑到您获得的易用性和性能。

还有一些安全注意事项,例如,如果您的应用程序允许第三方脚本化,那么滥用FFI将会毫不留情地崩溃您的应用程序而没有警告。


1
FFI函数的另一个缺点是它们没有关于调用它们的lua状态的概念,如果您需要在该环境中更改_GLOBAL等,则无法帮助。此外,请注意FFI与C++异常的兼容性。 - Necrolis
2
是的,但这实际上是FFI和C/API之间的区别。在Lua C API的情况下,您在C端定义绑定,而在FFI的情况下,您从Lua端定义它们。在那里,您可以更改全局变量。 - W.B.
在最后一段中,也就是说,该应用程序正在尝试提供API,以便用户可以编写脚本,但使用FFI可能存在潜在的安全风险,是吗? - Ani

1
关于C ++,这里有一个关于调用C ++的lua-l列表线程,涉及到这个问题: http://lua-users.org/lists/lua-l/2011-07/threads.html#00492 除了WB的答案之外:这取决于您使用JIT编译器还是解释器。您无法在某些平台上运行JIT(例如iOS,由于许可限制)。因此,使用LuaJit FFI可能不会更快(当使用解释器时,它大约慢8-10倍),但是LuaJit解释器比Lua VM快2-3倍。
我也对从Lua调用C ++感兴趣,目前正在评估LuaJit。我使用Ponder生成Lua绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接