lua_pop和lua_remove是Lua中的两个函数,都用于从栈中删除元素。 lua_pop函数将栈顶元素弹出并删除,同时将栈顶指针减少一个,即将下一个元素变为新的栈顶。 lua_remove函数可以删除栈中指定位置的元素,同时将该位置之上的元素下移,以填补空位。注意,它只能删除索引位置处的元素,不能删除指定值的元素。 总之,lua_pop更适用于简单的栈操作,而lua_remove更适用于需要操作栈中指定位置的情况。

目前我正在用 C++ 开发自己的脚本虚拟机管理类。Lua、Lua C/C++ 的使用对我来说没有问题,但是有一个问题让我困惑:什么时候使用 lua_pop,什么时候使用 lua_remove

据我所知,lua_pop 是自顶向下删除栈顶的多个值,以消除不再需要的数据,而 lua_remove 则是从任意有效的栈索引中删除单个值(基本上是 Lua 手册对两者的解释)。但是,我注意到网上有一些代码片段混合使用 lua_poplua_remove,但当我尝试在需要删除栈顶元素的地方使用 lua_pop 时,遇到了问题。所以,您能否提供一个确定正确使用这两个函数的例子或解释,以及相对速度和效率?我假设 lua_poplua_remove 更快,这也是我希望尽可能使用 lua_pop 的原因之一,除了编写“正确的代码”。

原文链接 https://stackoverflow.com/questions/2102942

点赞
stackoverflow用户122460
stackoverflow用户122460

lua_remove 的一个典型示例是访问表格。以下摘自Lua参考手册

lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* 要索引的表 */
lua_getfield(L, -1, "x");        /* 推送 t.x 的结果 (第二个参数) */
lua_remove(L, -2);                  /* 从栈中移除 't' */

lua_getfield 推送了 t[x] 到栈中。您不再需要 t,因此需要将其移除。

lua_pop 的一个典型示例是迭代表格。

lua_pushnil(L);  /* 第一个键 */
while (lua_next(L, t) != 0) {
    /* 使用 'key' (在索引 -2 处) 和 'value' (在索引 -1 处) */
    /* 对键和值进行操作 */

    lua_pop(L, 1);
}

完成单次迭代后,您需要将键推到栈顶,以便 lua_next 知道下一个键/值对。您需要移除位于栈顶的值。

这并不是一个最终的示例。在Lua中,您只需要使用适合您的方法,始终记住您的 lua_State 堆栈中有什么,您就可以做得很好。

2010-01-20 16:49:43
stackoverflow用户30470
stackoverflow用户30470

它们非常不同。lua_pop始终从栈顶移除。lua_remove则可以从栈的任何位置移除值。如果要从栈中移除的值不在栈顶,则无法使用lua_pop

例如:

[5][4][3][2][1]
执行 lua_pop(L, 3); 后会变成
[X][X][X][2][1]

[5][4][3][2][1]
执行 lua_remove(L, 3); 后会变成
[X][5][4][2][1]
2010-01-28 21:57:47
stackoverflow用户1205758
stackoverflow用户1205758

以下这些 C 代码片段是完全等价的:

lua_pop(L, 1); // 和下面这个一样:
lua_remove(L, -1);

这些也是:

lua_pop(L, n); // 和下面这个一样:
lua_settop(L, lua_gettop(L)-n);
2012-02-13 00:21:23