wei5635607 2019-11-21 15:43 采纳率: 0%
浏览 254

lua的table定义是在堆上面创建内存的吗?

定义一个local table = {value = 0}
然后使用table.insert插入到另外一个table2中 重复插入2次
这时候table2中有3个元素 令table.value=2
然后通过table2[1].value table2[2].value table2[3].value这种形式打印出来的值居然都成了2
去了函数体外面后打印也是2 难道table2中实际存的是table的地址? 然后该内存还是在堆上创建的?如果是地址或者引用 那为什么出了函数体这个内存没有被回收掉
我有点懵逼了!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 11:18
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    Lua中的表(Table)是基于哈希表设计的。它是一种动态存储结构,可以在运行时根据需要添加或删除键值对。Lua中的每个表都有一个唯一的哈希码,用于快速查找和更新表项。

    当你创建一个新的本地表时,例如 local table = {value = 0},实际上就是在堆栈上分配了一个新的哈希表空间。然后你可以通过 table.insert 方法向表中添加更多的元素。但是,在Lua中,表并不像Python那样直接存储其内容。相反,它是以字节流的形式保存的,这意味着即使你修改了表的内容,但Lua仍然能够保持原来的哈希码来定位和访问这些数据。

    如果你在函数体外再次尝试访问表中的元素,这实际上是将这个表从堆栈上释放出来,并将其转换为字节流的形式,这样就可以在不同的上下文中访问相同的表内容了。

    至于你的问题,“table2中有3个元素”,这是因为在堆栈上创建的表并不总是与Lua环境共享同一个哈希码。当表被插入到另一个表时,它的哈希码可能不同,所以看起来似乎有三个不同的表项。

    然而,正如我之前提到的,当你再次调用 table2[1].value, table2[2].value, 和 table2[3].value 来访问表项时,实际上是在字节流形式下操作的,而不是原始的哈希表。因此,无论你在哪里调用这些变量,它们指向的都是同一个哈希码对应的表项,这使得它们看起来像是同一个表项。

    总之,Lua中的表并不是直接存储在堆栈上的,而是通过哈希码进行索引的。当你改变表项时,你需要确保你的哈希码也相应地改变,否则你可能会遇到一些不寻常的行为。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何使用Echarts制作途中时间序列表
  • ¥15 图论相关的数学问题,共10个
  • ¥15 EtherCAT的问题,创建一个XML文件
  • ¥15 微信公众号羽毛球自动抢定场程序制作
  • ¥15 Fluent UDF 编写
  • ¥15 xcode开发的macos应用,如何使窗口居中显示?
  • ¥20 统信uos升级apt后启动失败
  • ¥15 求指导储层饱和度及含水率测井解释
  • ¥200 建三维地震工区写入sgy到指定目录
  • ¥30 靶向捕获测序探针设计自学