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

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] = key = {} --create second key
a[key] = 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,因为该函数是在后台自动运行的,它有自己的运行周期和规律。

Lua弱表Weak table的更多相关文章

  1. Lua中的weak表——weak table

    弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...

  2. Lua中的weak表——weak table(转)

    弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...

  3. lua弱表引用

    1.普通垃圾回收 --lua弱表,主要是删除key或者value是table的一种元方法 --元表里的__mode字段包含k或者v:k表示key为弱引用:v表示value为弱引用 local test ...

  4. Lua 基础之Weak Table(5)

    Lua垃圾收集策略 Lua自动进行内存的管理.程序只能创建对象,而没有执行删除对象的函数.通过使用垃圾收集技术,Lua会自动删除那些失效的对象,也就是引用为0 的对象.但是呢?有些对象,引用没有指向它 ...

  5. lua中的weak table

    weakTable = {} weakTable[] = function() print("i am the first element") end weakTable[] = ...

  6. lua weak table 概念解析

    lua weak table 经常看到lua表中有 weak table的用法, 例如: weak_table = setmetatable({}, {__mode="v"}) 官 ...

  7. Lua弱引用table

    弱引用table 与python等脚本语言类似地,Lua也采用了自动内存管理(Garbage Collection),一个程序只需创建对象,而无需删除对象.通过使用垃圾收集机制,Lua会自动删除过期对 ...

  8. Step By Step(Lua弱引用table)

    Step By Step(Lua弱引用table) Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃 ...

  9. Lua表(table)的用法_个人总结

    Lua表(table)的用法_个人总结 1.表的创建及表的介绍 --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意 ...

随机推荐

  1. CSP201512-2:消除类游戏

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  2. 城市规模越大,工资、GDP、犯罪率越高:4.5星|《规模》

    规模 信息浓度非常高的一本书.篇幅也不小,纸书有568页,致谢与注释只占7%. 全书讲各种复杂的东西中存在的普遍规律:哺乳动物体重每增加一倍,心率降低25%:城市人口每增加一倍,加油站只增加85%:城 ...

  3. MongoDB Chapter1:Introduction

    你是在防火墙后面吗? 为了继续本课程,您必须能够将计算机的传出请求发送到我们在MongoDB Atlas中设置的数据库服务器.这些服务器在Amazon AWS中的端口27017上运行. 请单击http ...

  4. Web全景图的原理及实现

    全景图的基本原理 全景图是一种广角图.通过全景播放器可以让观看者身临其境地进入到全景图所记录的场景中去.比如像是这个.这种看起来很高大上的效果其实背后的原理并不复杂. 通常标准的全景图是一张2:1的图 ...

  5. Scrum立会报告+燃尽图(十月二十五日总第十六次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  6. 团队计划第二期Backlog

    团队计划第二期Backlog 一. 计划会议过程        今天中午我们小组就我们团队开发第二阶段的冲刺召开计划会议,总结了第一阶段开发的问题.不足和经验教训,然后对本次冲刺计划进行了合理的规划和 ...

  7. lintcode-424-逆波兰表达式求值

    424-逆波兰表达式求值 求逆波兰表达式的值. 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2" ...

  8. DB2 9.5 数据库分区管理及应用实践

    DB2 数据库分区是 DB2 企业版 DPF(Data Partitioning Feature)选件提供的,它主要用来为大规模数据处理.高并发数据访问提供支持.DB2 数据库分区采用 Share-n ...

  9. memached实现tomcat的session共享

    由于项目服务器用的阿里云的ECS,Memcached也采用的阿里云.多个tomcat集群的session都存储在一个云memcached中. 配置步骤如下: 一.tomcat增加memcached支持 ...

  10. PHP中与类和对象有关的几个系统函数

    与类有关的系统函数: class_exists(“类名”), 判断一个类是否存在(是否定义过) interface_exists(“接口名”), 判断一个接口是否存在(是否定义过) get_class ...