lua学习笔记之垃圾收集
1、弱表
弱表如何声明呢?通过元表字段__mode来声明,其值必须是字符串,"k"表示关键字是弱的,"v"表示值是弱的,"kv"表示键和值都是弱的。对象才可以收集,数字,布尔,字符串类型的不可以收集。
2、记忆化函数
通过表来记录计算结果,避免下次的重复计算。同时使用弱表来在没有引用时,通过垃圾收集自动处理
local results = {}
setmetatable(results, {__mode = "kv"})
function mem_loadstring(s)local res = results[s]if res == nil thenres = assert(load(s))results[s] = resendreturn res
end
3、弱表实现默认值
local defaults = {}
setmetatable(defaults, {__mode = "k"})
local mt = {__index = function(t) return defaults[t] end}function setDefault(t, d)defaults[t] = dsetmetatable(t, mt)
end
不同的默认值使用不同的元表,同时使用记忆化特性
local metas = {}
setmetatable(metas, {__mode = "v"})function setDefault(t, d)local mt = metas[d]if mt == nil thenmt = {__index = function() return d end}metas[d] = mtendsetmetatable(t, mt)
end
4、虚表
dolocal mem = {}setmetatable(mem, {__mode = "k"})function factory(o)local res = mem[o]if not res thenres = (function() return o end)mem[o] = resendreturn resend
end
因为mem表中的键值对应的是闭包,而闭包又引用键值,导致环。严格的解释器是不会收集key的。
lua中对于表的键值为弱的,而值不是弱的,视为虚表。
5、终结器
lua通过元方法__gc来实现终结器
o = {x = "hi"}
setmetatable(o, {__gc = function(o) print(o.x) end})
o = nil
collectgarbage()
输出为:
hi
如果在设置元表时,没有设置__gc,后面在通过__gc字段设置不起作用。
o = {x = "hi"}
mt = {}
setmetatable(o, mt)
mt.__gc = function(o) print(o.x) end
o = nil
collectgarbage()输出:
没有输出
在上面情况时,可以先设置元表的标识为true,在设置元表后,再通过字段设置,也是可以的
o = {x = "hi"}
mt = {__gc = true}
setmetatable(o, mt)
mt.__gc = function(o) print(o.x) end
o = nil
collectgarbage()
输出:
hi
在收集相关联对象时,关联关系不会影响收集顺序
以单链表为例
mt = {__gc = function(o) print(o[1]) end}
list = nil
for i = 1, 3 dolist = setmetatable({i, link = list}, mt)
endlist = nil
collectgarbage()输出为:
3
2
1
当终结器执行时,会将终结的对象作为参数传递给它,此时对象为短暂复活,执行完后,作为永久复活
lua学习笔记之垃圾收集相关推荐
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...
- Lua 学习笔记(一)
Lua学习笔记 1.lua的优势 a.可扩张性 b.简单 c.高效率 d.和平台无关 2.注释 a.单行注释 -- b.多行注释 --[[ --]] 3.类型和 ...
- 微信小程序连接物联网(二):NodeMCU Lua学习笔记
索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...
- lua 学习笔记---游戏开发第一步
lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...
- Lua学习笔记(2)
前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...
- 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一
Grabage Collection GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...
- Lua 学习笔记(一)环境搭建
Lua是一个小巧的脚本语言.Lua由标准C编写而成,代码简洁,几乎在所有的操作系统和平台上都可以编译,运行. 主要讲一下mac和win下的环境搭建. 工具: 1.Sublime Text 2 2.Lu ...
- cocos2d-x lua 学习笔记(1) -- 环境结构
Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...
- cocos2d-x lua 学习笔记(1) -- 环境搭建
Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...
最新文章
- 刘鹏飞 袁玮哲:自动生成论文评审意见!AI可以取代审稿人吗?
- matlab中窗函数的使用(一)
- SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话
- SwiftUI之深入解析如何创建和组合视图
- eureka对比Zookeeper:
- Flink数据清洗(Kafka事实表+Redis维度表)
- 抖音一个老人和一个机器人歌曲_一个老人孤独去世,一个老人安然离世
- 990. 等式方程的可满足性
- C++ 引用计数技术及智能指针的简单实现
- C++中打印可变参数函数输出到控制台
- python pipe_Python os.pipe()用法及代码示例
- Java调用百度/高德地图API实现根据经纬度查地名
- RAKsmart日本服务器的综合性能评测
- 为什么世界上没有安全的工作?
- 转:亚熟男 我们该拿你怎么办?
- ECU BootLoader and programming implementation specification
- 时间与日期处理模块 题目解题报告
- 【已解决】Word转换PDF时自动更新域导致图片表格的引用编号全部乱掉
- 使用gitbash创建一个翻译词典
- 扭矩扭力测量——扭矩传感器
热门文章
- WIN7 X64 Setup Oracle Developer Suite 10g
- 解決scott 用戶登錄錯誤: invalid username/password;logon denied
- ueditor图片上传,网络连接错误的解决方案
- 《转》从程序员到项目经理(五):不是人人都懂的学习要点
- android控件属性
- 基于MIPS架构的BackTrace实现
- python使用缩进来体现代码之间的逻辑关系-Python 使用缩进来体现代码之间的逻辑关系 ....
- 下列不是python对文件的读操作方法是-大工20春《数据挖掘》在线作业1【参考答案】...
- java和python可以在一个项目中同时使用么-可以同时用python和java开发一个app吗?...
- python怎么用excel-用Python控制Excel实现自动化办公,手把手教你