lua_pop和lua_remove是Lua中的两个函数,都用于从栈中删除元素。 lua_pop函数将栈顶元素弹出并删除,同时将栈顶指针减少一个,即将下一个元素变为新的栈顶。 lua_remove函数可以删除栈中指定位置的元素,同时将该位置之上的元素下移,以填补空位。注意,它只能删除索引位置处的元素,不能删除指定值的元素。 总之,lua_pop更适用于简单的栈操作,而lua_remove更适用于需要操作栈中指定位置的情况。
2021-11-1 18:2:54
收藏:0
阅读:351
评论:3
目前我正在用 C++ 开发自己的脚本虚拟机管理类。Lua、Lua C/C++ 的使用对我来说没有问题,但是有一个问题让我困惑:什么时候使用 lua_pop
,什么时候使用 lua_remove
。
据我所知,lua_pop
是自顶向下删除栈顶的多个值,以消除不再需要的数据,而 lua_remove
则是从任意有效的栈索引中删除单个值(基本上是 Lua 手册对两者的解释)。但是,我注意到网上有一些代码片段混合使用 lua_pop
和 lua_remove
,但当我尝试在需要删除栈顶元素的地方使用 lua_pop
时,遇到了问题。所以,您能否提供一个确定正确使用这两个函数的例子或解释,以及相对速度和效率?我假设 lua_pop
比 lua_remove
更快,这也是我希望尽可能使用 lua_pop
的原因之一,除了编写“正确的代码”。
原文链接 https://stackoverflow.com/questions/2102942
点赞
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
以下这些 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
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
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 堆栈中有什么,您就可以做得很好。