我知道它是退栈的,但是退的是栈底还是栈顶。搜索一波还是没明白,自己动手测吧...
测试程序
static int lua_test(lua_State *L)
{
int pop_num = lua_tointeger(L,1);
lua_settop(L,0);
printf("1-top %d\r\n",lua_gettop(L));
lua_pushinteger(L,31);
lua_pushinteger(L,32);
lua_pushinteger(L,33);
lua_pushinteger(L,34);
printf("2-top %d\r\n",lua_gettop(L));
lua_pop(L,pop_num);
printf("3-top %d\r\n",lua_gettop(L));
printf("栈底 %d\r\n",lua_tointeger(L,1));
printf("栈顶 %d\r\n",lua_tointeger(L,-1));
return 0;
}
测试过程:
hx.test(0)
1-top 0
2-top 4
3-top 4
栈底 31
栈顶 34
一个都没有丢掉
hx.test(1)
1-top 0
2-top 4
3-top 3
栈底 31
栈顶 33
把原来栈顶的34给丢了
hx.test(2)
1-top 0
2-top 4
3-top 2
栈底 31
栈顶 32
把栈顶的两个给丢了
hx.test(-1)
1-top 0
2-top 4
3-top 0
栈底 0
全部都丢了
总结
lua_pop(L,num)函数从栈顶开始移除。
- 当num>0时从栈顶移除指定个数 。
- 当num=0时栈不受影响
- 当num=-1时栈中元素全部移除
- 其他负数逻辑就有点乱了,建议不要使用其他(<-1)负值。最终的解释权还得看lua_settop.
#define lua_pop(L,n) lua_settop(L, -(n)-1)
lua_settop函数说明
- 该函数用于指定栈的高度,栈只能从栈顶压栈,不能从栈底添加数据。所以栈底的数据会保持不变。
- 当新的高度大于原来的高度时,会从栈顶压入数据,压入的数据不可用(因为是随机的)。
- 当新的高度小于原来的高度时,会从栈顶移除多余的元素。
- 当输入参数为负数时,表示从栈顶开始的索引(最栈顶元素为-1)。该函数会移除栈顶到该元素之间的所以元素。-1则无,-2 则移除-1 。-3则移除-1,-2。以此类推。但是负数编号不能超出栈底的负数索引,超出会抛出异常。lua_pop函数及是使用了该特性。
接上 lua_pop函数说明
#define lua_pop(L,n) lua_settop(L, -(n)-1)
- 当n为-1时 lua_settop(L,0) 移除所有元素 ,正常
- 当n<-1 时,-(n)-1为正数,堆栈可能会高于原来的堆栈,此时却压入了新的栈,lua不会报错。违背了lua_pop的初衷。
- 当n>0时,-(n)-1 等于负数,从栈顶开始移除n个参数,但是 -n-1不得超过栈底,会报错,及n不能超过当前栈中个数。
- 如果不想从栈顶为起点移除除元素,而是移除从栈底起指定元素到栈顶的所有元素,直接用lua_settop即可。
总结到此,后面可以回来查查。我是真记不住