lua_pushstring 与 lua_pushliteral 之间的差异

根据文档(https://www.lua.org/manual/5.3/manual.html#lua_pushliteral)的说法: 这个宏与 lua_pushstring 等价,但只应在 s 为文字字符串时使用。

但我根本不理解上述解释。 就我所见,从 lua_pushliteral 的宏定义来看,没有区别:

#define lua_pushliteral(L, s) lua_pushstring(L, "" s)

点赞
用户3574628
用户3574628

Lua 5.4 中 lua_pushliteral文档 和 5.3 相同,只是添加了 "(Lua may optimize this case.)"。因此,虽然它目前与调用 lua_pushstring 相同,但 Lua 开发人员在未来也可能进行优化。

编辑:以 lua_pushstring 为例,文档 中说:

Lua 将创建或重用给定字符串的内部副本,因此在函数返回后,可以释放或立即重用 s 处的内存。

但 C 字符串字面量是只读的,因此 C 代码无法释放或重用内存。此外,Lua 字符串是不可变的。将一个不可变对象复制到另一个不可变对象基本上是没有用的,因为您可以从两个位置引用同一内存。这意味着优化 lua_pushliteral 的一种可能的方法是不执行 lua_pushstring 所做的复制。

2020-12-03 03:47:14