lua_pop lua_settop 栈研究

我知道它是退栈的,但是退的是栈底还是栈顶。搜索一波还是没明白,自己动手测吧...

测试程序

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即可。

总结到此,后面可以回来查查。我是真记不住 

你可能感兴趣的:(lua,C,lua)