lua_pop vs lua_remove 目前我在C++中构建了自己的脚本VM管理器类,我对Lua+Lua C或C++的任何一个都没有问题,但是我困惑的一个部分是:何时使用 LuaAupp[b/Cord] >以及何时使用 LuaaAdvestue/Cuff>。p>
据我所知,lua_pop vs lua_remove 目前我在C++中构建了自己的脚本VM管理器类,我对Lua+Lua C或C++的任何一个都没有问题,但是我困惑的一个部分是:何时使用 LuaAupp[b/Cord] >以及何时使用 LuaaAdvestue/Cuff>。p>,c++,c,lua,C++,C,Lua,据我所知,lua_-pop是从上到下删除多个值(堆栈上),消除不再需要的数据,其中aslua_-remove是从任意有效堆栈索引中删除单个值(基本上是lua手册对这两个索引所说的:p) 但我注意到web上分散的ceratin代码段混合了lua_-pop和lua_-remove,但当我尝试使用lua_-pop而不是lua_-remove时,我遇到了问题,那么,是否有可能获得一个明确的例子或解释,说明如何以及何时正确使用这两个功能,以及这两个功能的相关速度和效率(我假设lua\u-pop比lua\u
lua_-pop
是从上到下删除多个值(堆栈上),消除不再需要的数据,其中aslua_-remove
是从任意有效堆栈索引中删除单个值(基本上是lua手册对这两个索引所说的:p)
但我注意到web上分散的ceratin代码段混合了lua_-pop
和lua_-remove
,但当我尝试使用lua_-pop
而不是lua_-remove
时,我遇到了问题,那么,是否有可能获得一个明确的例子或解释,说明如何以及何时正确使用这两个功能,以及这两个功能的相关速度和效率(我假设lua\u-pop
比lua\u-remove
快,这就是我想要尽可能多地使用lua\u-pop
的原因之一,除了编码“正确的代码”之外)
谢谢:)lua\u remove的一个典型示例是访问表。来自的片段 lua_getfield将t[x]推到堆栈上。您不再需要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_状态堆栈上的内容,您就会没事。它们非常不同
lua_pop
始终从堆栈顶部移除lua_remove
将从堆栈上的任何对象中删除一个值。如果要从堆栈中删除的值不在顶部,则不能使用lua\u pop
e、 g
以下C代码完全等效:
lua_pop(L, 1); // same as:
lua_remove(L, -1);
这些也是:
lua_pop(L, n); // same as:
lua_settop(L, lua_gettop(L)-n);
不要担心效率。“编写‘正确的代码’”更为重要。我喜欢让它正确,这样我就可以在它完成时进行优化。只有在您的代码正常工作并且需要明显和可测量的优化之后,才进行优化。没有必要为了炫耀而增加复杂性和更高的维护成本。我同意,我没有时间浪费在浏览生成的程序集上,看看a在哪里可以通过微小的调整获得几个周期(我把它留到我真的很无聊的时候;)),这就是为什么我要问这个问题,尽管我的代码工作得完美无缺,但是完美地工作并不意味着它完全正确,所以,第一点是检查它是否正确,如果任何一种方法都是正确的,检查第二点,即检查使用x func比y func是否有任何好处,如果值得的话,实施它,否则,请在源代码中留下注释,以供将来参考。谢谢。我将再次查看“表”部分,看看这是否有帮助:)
lua_pop(L, 1); // same as:
lua_remove(L, -1);
lua_pop(L, n); // same as:
lua_settop(L, lua_gettop(L)-n);