目前,我正在用C++构建我自己的脚本VM管理器类。我对Lua & Lua或C++没有任何问题,但让我困惑的是什么时候使用lua_pop,什么时候使用lua_remove。
据我所知,lua_pop是从上到下删除多个值(在堆栈上),消除不再需要的数据,而as lua_remove用于从任意有效的堆栈索引中删除单个值(基本上就像Lua手册中所说的那样:P)。
但是我注意到web上散布着一些混合了lua_pop和lua_remove的代码片段,但是当我尝试使用lua_pop而不是lua_remove时,我遇到了问题。那么,有没有可能得到一个明确的例子或解释,说明如何以及何时正确使用这两个函数,以及这两个函数的相对速度和效率?我假设lua_pop比lua_remove更快,这也是我想要尽可能多地使用lua_pop的原因之一,除了编写“正确的代码”。
发布于 2010-01-21 00:49:44
lua_remove的一个典型示例是访问表。来自Lua reference manual的代码片段。
lua_getfield(L, LUA_GLOBALSINDEX, "t"); /* table to be indexed */
lua_getfield(L, -1, "x"); /* push result of t.x (2nd arg) */
lua_remove(L, -2); /* remove 't' from the stack */lua_getfield将tx推送到堆栈上。您不再需要t,因此您将其删除。
lua_pop的一个典型例子是对表进行迭代。
lua_pushnil(L); /* first key */
while (lua_next(L, t) != 0) {
/* uses 'key' (at index -2) and 'value' (at index -1) */
/* do whatever you like with the key and the value */
lua_pop(L, 1);
}在完成一次迭代之后,您需要将键放在堆栈的顶部,以便lua_next知道接下来是哪个键/值对。您需要删除位于堆栈顶部的值。
这不是一个明确的例子。在Lua中,你可以做任何对你有用的事情。请始终牢记lua_State堆栈上的内容,这样就不会有问题了。
发布于 2010-01-29 05:57:48
它们是非常不同的。lua_pop总是从堆栈的顶部删除。lua_remove将从堆栈上的任何对象中删除一个值。如果您希望从堆栈中删除的值不在顶部,则不能使用lua_pop。
例如:
[5][4][3][2][1]
after lua_pop(L, 3); would be
[X][X][X][2][1]
[5][4][3][2][1]
after lua_remove(L, 3); would be
[X][5][4][2][1]发布于 2012-02-13 08:21:23
以下几段C代码是完全等效的:
lua_pop(L, 1); // same as:
lua_remove(L, -1);这些也是:
lua_pop(L, n); // same as:
lua_settop(L, lua_gettop(L)-n);https://stackoverflow.com/questions/2102942
复制相似问题