在 Lua C API 中,它提供了几个堆栈操作函数,如 Lua 的文档 所述。
int lua_gettop (lua_State *L);
void lua_settop (lua_State *L, int index);
void lua_pushvalue (lua_State *L, int index);
void lua_remove (lua_State *L, int index);
void lua_insert (lua_State *L, int index);
void lua_replace (lua_State *L, int index);
我的第一个问题是,这些函数的复杂度是什么?它是O(1)还是O(|index|)?我查看了Lua手册,发现Lua有两种不同的堆栈实现(基于堆栈和基于寄存器)。
更具体地说,如果我想从lua堆栈中读取并弹出前三个元素,我可以考虑以下两种实现方式,请问哪一种更具性能/推荐性?
解决方案1 - 逐个读取和弹出值:
for (int i = 0; i < 3; ++i) {
values[i] = lua_tostring(lua_state, -1);
...
lua_pop(lua_state, 1);
}
解决方案2 -- 先读取全部然后再逐一弹出:
for (int i = 0; i < 3; ++i) {
values[i] = lua_tostring(lua_state, -1 - i);
}
...
lua_pop(lua_state, 3);
lua_tostring
返回的指针在从堆栈中弹出后不能保证有效。请参阅手册中的 lua_tolstring。如果需要保留字符串值,请进行复制。 - Adam