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

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. libCurl 初步认识 - cur easy

    cur easy接口简洁明了,主接口4个,辅接口5个. 主接口 初始化 + 配参数 + 执行 + 销毁 初始化 CURL* curl_easy_init() 获得CURL句柄,返回值需要判空. 配参数 ...

  2. shell基础 -- grep、sed、awk命令简介

    在 shell 编程中,常需要处理文本,这里介绍几个文本处理命令. 一.grep 命令 grep 命令由来已久,用 grep 命令来查找 文本十分方便.在 POSIX 系统上,grep 可以在两种正则 ...

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

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

  4. 创建hive与hbase关联的hive表与hbase表

    创建hive与hbase的关联表 create external table hive_hbase(rowkey string,name string,addr string,topic string ...

  5. 欢迎来怼—第二次Scrum会议

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片 二.开会信息 时间:2017/10/14 18:30~18:47,总计17min.地点:东北师范 ...

  6. Sqlserver学习研究

    关注关键词 :Sqlserver实用工具配置步骤 1)创建实用工具控制点(UCP) 2)连接到现有UCP 3)相UCP注册SQL Server实例 4)创建数据层应用程序 5)设置资源运行状况策略 6 ...

  7. 用C++实现简单随机二元四则运算

    让我们想看看二元四则运算都需要实现什么: (1) 定制题目数量 (2) 是否有乘除法 (3) 题目数值范围 (4) 加减有无负数 (5) 除法有无余数 (6) 是否支持分数(真分数.假分数…) (7) ...

  8. 自定义ClassLoader,用于加载用户JAR包

    最近在考虑C/S结构程序的软件自动升级的实现方式,比如QQ.飞信等都自动升级的功能. 自动升级模块虽然还没有编码完成,但是思路还是比较清晰的. 自动升级过程中,升级文件的JAR包是专门加载到程序中去的 ...

  9. WPF/MVVM快速指引

    简介 最近微软推出了UWA,又是一波新的C#+xaml学习热.好多小伙伴都对MVVM感觉很好奇,但是有些地方也有点难以理解.特意写了这边文章,希望对你有帮助. 这边文章会很长,所以我会用几个例子的形式 ...

  10. mysql的程序组成

    MySQL的程序组成 1:客户端 mysql:客户端程序 mysqldump:mysql备份工具 mysqladmin:mysql管理工具 mysqlbinlog:二进制日志查询工具 2:服务端 my ...