Lua堆栈操作的复杂性(Lua C API)

Lua堆栈操作的复杂性(Lua C API),c,lua,C,Lua,在luaapi中,它提供了中提到的几个堆栈操作函数 我的第一个问题是,这些函数的复杂性是什么?是O(1)还是O(|索引|)?我检查了,Lua似乎有两种不同的堆栈实现(基于堆栈和基于寄存器) 更具体地说,如果我想阅读并弹出lua堆栈中的前三个元素,我可以想到以下两个实现,我能知道哪一个更具性能/建议的方式吗 解决方案1——读取并弹出每个值: for (int i = 0; i < 3; ++i) { values[i] = lua_tostring(lua_state, -1); .

在luaapi中,它提供了中提到的几个堆栈操作函数

我的第一个问题是,这些函数的复杂性是什么?是O(1)还是O(|索引|)?我检查了,Lua似乎有两种不同的堆栈实现(基于堆栈和基于寄存器)

更具体地说,如果我想阅读并弹出lua堆栈中的前三个元素,我可以想到以下两个实现,我能知道哪一个更具性能/建议的方式吗

解决方案1——读取并弹出每个值:

for (int i = 0; i < 3; ++i) {
  values[i] = lua_tostring(lua_state, -1);
  ...
  lua_pop(lua_state, 1);
}
for(int i=0;i<3;++i){
值[i]=lua_-tostring(lua_状态,-1);
...
lua_pop(lua_州,1);
}
解决方案2--全部读取,然后全部弹出:

for (int i = 0; i < 3; ++i) {
  values[i] = lua_tostring(lua_state, -1 - i);
}
...
lua_pop(lua_state, 3);
for(int i=0;i<3;++i){
值[i]=lua_-tostring(lua_状态,-1-i);
}
...
卢厄波普(卢厄州,3);
lua\u pop
as

#define lua_pop(L,n)            lua_settop(L, -(n)-1)
并且可以看到
lua_settop
;它将用
nil
填充堆栈插槽,因此可以对值进行gc。所以它是带有arg
1
的O(1)

可以读取O(1)中的每个值,N个值的pop为O(N)

因此,您的两种方法应该大致相同


Re:读取O(1)中的值时,函数将堆栈偏移量转换为地址。

为什么不查看源代码?但不同版本可能有不同的实现?我只是想知道一个是否总是比另一个更受欢迎。。从
lua\u tostring
返回的指针在从堆栈弹出后不保证有效。请参阅手册中的。如果需要保留字符串值,请复制一份。这个答案似乎毫无意义。问题是访问元素-3是否比访问元素-1慢。问题甚至不是关于lua_pop的!即使是这样,您的回答也没有告诉我们关于
lua\u pop
@immibis的速度,对不起,我在完成回复之前发布了。希望现在更清楚了。不过,问题不是问lua_pop的性能,而是问访问堆栈的其他函数的性能。谢谢您的回答。关于“您可以读取O(1)中的每个值”,您是否碰巧有一个参考来证明此部分的合理性?@keelar,请参阅我关于
index2addr
#define lua_pop(L,n)            lua_settop(L, -(n)-1)