• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua弱表Weak table

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

定义:弱表的使用就是使用弱引用,很多程度上是对内存的控制。

1、weak表示一个表,它拥有metatable,并且metatable定义了__mode字段。

2、弱引用不会导致对象的引用计数变化。换言之,一个对象只有弱引用指向它,那么gc会自动回收该对象的内存。

3、__mode字段可以取以下三个值:k、v、kv。任何情况下,只要key和value中一个被gc,那么key-value pair都被从表中移除了。

weak table 简单应用eg1:

a = {}
b = {}
setmetatable(a,b)
b.__mode = "k"  --now 'a' has weak keys

key = {}   --create first key
a[key] = 1

key = {}   --create second key 
a[key] = 2

for k,v in pairs(a) do
    print(v) --1   2
end
collectgarbage()  --forces a garbage collection cycle
for k,v in pairs(a) do
    print(v) --2  
    --[[第二个赋值语句key={}覆盖了第一个key的值。当垃圾收集器工作时,
    在其他地方没有指向第一个key的引用,所以它被收集了,因此相对应的table中的入口也同时被移除了。
    可是,第二个key,仍然是占用活动的变量key,所以它不会被收集。--]]    
end

给table添加__mode元方法(__mode = "k"),就代表这个table的key是弱引用,一旦其他地方对于key值的引用取消了(设值为nil),那么这个table里的这个字段也会移除。

weak table 简单应用eg2:

local res = {}  
setmetatable(res,{__mode = "v"})  
function createRGB(r, g, b)  
    local key = r .. "-" .. g .. "-" .. b  
    if res[key] then  
        return res[key]  
    else  
        local newcolor = {red = r,green = g,blue = b}  
        res[key] = newcolor  
        return newcolor  
    end  
end  

一个相当普遍的编程技术就是用空间换取时间,看上面的例子是服务器存储处理后的结果,一些命令一遍遍的重复执行,早晚有一天,它会挤爆服务器的内存。

一个weak表提供了这个问题的简单解决方案,如果这个结果表中有weak表,每次的垃圾循环都会移除当前时间内所有未被使用的结果(通常差不多是全部)。

在实际的代码过程中,我们不一定需要手动collectgarbage,因为该函数是在后台自动运行的,它有自己的运行周期和规律。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++Lua配置发布时间:2022-07-22
下一篇:
luanet更名为distri.lua发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap