lua的弱表(weak table)简介

lua的弱表(weak table)简介

变量和值的区别
变量是值的载体,变量消失,值却不一定消失


object
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.



垃圾回收
能够被回收的对象包括:All memory used by Lua is subject to automatic management: tables, userdata, functions, threads, strings, etc.

强引用,弱引用
在没有引入弱表前,所有对象引用皆为强引用。当对象没有任何引用或仅为弱引用时,对象被回收(lua执行collectgarbage,c执行lua_gc)


弱表(weak table)
一个表是弱表,仅当
1. 该表有一个元表
2. 元表有成员__mode
3. __mode的取值为"k"或"v"或"kv",一次表示键是弱的,值是弱的或者键值都是弱的

要注意,只有对象才可以从一个weak table中被收集。比如数字和布尔值类型的值,都是不会被收集的。例如,如果我们在table中插入了一个数值型的key,它将永远不会被收集器从table中移除。当然,如果对应于这个数值型key的vaule被收集,那么它的整个入口(keyvaluepair)将会从weak table中被移除。

关于字符串的一些细微差别:尽管字符串是可以被收集的,他们仍然跟其他可收集对象有所区别。 其他对象,比如tables和函数,他们都是显示的被创建。比如,不管什么时候当Lua遇到{}时,它建立了一个新的table。任何时候这个 function()。。。end建立了一个新的函数(实际上是一个闭包)。然而,Lua见到“a”..“b”的时候会创建一个新的字符串?如果系统中已经有一个字符串“ab”的话怎么办?Lua会重新建立一个新的?编译器可以在程序运行之前创建字符串么?这无关紧要:这些是实现的细节。因此,从程序员的角度来看,字符串是值而不是对象。所以,就像数值或布尔值,一个字符串不会从weak tables中被移除(除非它所关联的vaule被收集)。



弱值(weak value)
如果弱表的值是弱的,那么当值所引用的object被垃圾回收时,键值对也从弱表中移除


弱键(weak key)
如果弱表的键是弱的,那么当键所引用的object被垃圾回收时,键值对也从弱表中移除

推荐阅读

    字符库快捷键|字符串快捷键

    字符库快捷键|字符串快捷键,,1. 字符串快捷键1、单行注释单行注释是 #Mac的快捷键是 command+/windows的快捷键是 Ctrl + /2、多行注

    电脑硬盘csgo凭空消失|csgo突然消失

    电脑硬盘csgo凭空消失|csgo突然消失,,1. csgo突然消失可能是系统出现卡顿,刷新一下重启试试2. csgo地图突然消失方法如下:1、在电脑中启动cs

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    电脑上的硬盘简介|电脑磁盘介绍

    电脑上的硬盘简介|电脑磁盘介绍,,1. 电脑磁盘介绍C盘,D盘,,E盘,F盘是一块硬盘上的不同分区,是为数据管理方便而划分的数据存储区域。一般来说,C

    苹果计算机外设:挂盘工具简介

    苹果计算机外设:挂盘工具简介,,通常,当我们使用苹果电脑时,我们经常连接到一些外部设备,例如:外部硬盘、MO驱动器等,但在某些情况下,即使线路正常