Lua程序设计 第17章 弱引用笔记

鉴于之前我对lua的评价,在此需要修改了一下我的言论:游戏开发语言工作中,最成熟的客户端开发组合:C/C++、Lua/C#、 assembly汇编。C/C++系列用于完成游戏引擎框架,汇编用于优化,Lua负责游戏逻辑。在全局上满足了性能、可读性、变化性的需求。因为我选的 是引擎方向,实际上只能吃透C/C++系列我才可能获得引擎 职位。另外推荐一本书《游戏引擎框架》-叶劲峰翻译的那本,并没有csdn某人读后感言“引擎水真深”的感觉。这本书写得好,可是那个废人却在叶劲峰的专 访中说这么本书很难,一定吓退了一些新人或至少泼了冷水。

lua的弱引用主要是实现一个类似于引用计数功能,目的还是用于管理内存。我怀疑table的引用管理就是建立在弱引用的基础上。通过设置一个table的__mode="kv"启用弱引用。

在弱引用就类似于引用计数为0的状态,当调用垃圾回收collectgarbage()会清理掉引用计算为0(类比,目前我没有看到源码的垃圾回收 实现)。,每次执行赋值操作,都会在该地址指向的对象执行+1操作,而数值、bool、字符串,应该作为常量。有个问题这个三种类型数据的清理时怎么实现 的?待续


首先知道table是个对象,平时引用式赋值都是地址外加引用技术。看看table和node源码定义就明白了

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedef struct Table {  
  2.   CommonHeader;  
  3.   lu_byte flags;  /* 1<<p means tagmethod(p) is not present */   
  4.   lu_byte lsizenode;  /* log2 of size of `node' array */  
  5.   struct Table *metatable;  
  6.   TValue *array;  /* array part */  
  7.   Node *node;  
  8.   Node *lastfree;  /* any free position is before this position */  
  9.   GCObject *gclist;  
  10.   int sizearray;  /* size of `array' array */  
  11. } Table;  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedef struct Table {  
  2.   CommonHeader;  
  3.   lu_byte flags;  /* 1<<p means tagmethod(p) is not present */   
  4.   lu_byte lsizenode;  /* log2 of size of `node' array */  
  5.   struct Table *metatable;  
  6.   TValue *array;  /* array part */  
  7.   Node *node;  
  8.   Node *lastfree;  /* any free position is before this position */  
  9.   GCObject *gclist;  
  10.   int sizearray;  /* size of `array' array */  
  11. } Table;  


数组部分:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ** Union of all Lua values  
  2. */  
  3. typedef union {  
  4.   GCObject *gc;  
  5.   void *p;  
  6.   lua_Number n;  
  7.   int b;  
  8. } Value;//这是非常经典的数据结构,可以将其名之为Lua数据原子,用来完成绝大部分数据存储 标注1  
  9.   
  10.   
  11. /* 
  12. ** Tagged Values 
  13. */  
  14.   
  15. #define TValuefields    Value value; int tt //tt是用来记录当前数据域存储的数据类型  
  16.   
  17. typedef struct lua_TValue {  
  18.   TValuefields;  
  19. } TValue;  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ** Union of all Lua values  
  2. */  
  3. typedef union {  
  4.   GCObject *gc;  
  5.   void *p;  
  6.   lua_Number n;  
  7.   int b;  
  8. } Value;//这是非常经典的数据结构,可以将其名之为Lua数据原子,用来完成绝大部分数据存储 标注1  
  9.   
  10.   
  11. /* 
  12. ** Tagged Values 
  13. */  
  14.   
  15. #define TValuefields    Value value; int tt //tt是用来记录当前数据域存储的数据类型  
  16.   
  17. typedef struct lua_TValue {  
  18.   TValuefields;  
  19. } TValue;  

键值对部分:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedef union TKey {  
  2.   struct {  
  3.     TValuefields;  
  4.     struct Node *next;  /* for chaining */  
  5.   } nk;  
  6.   TValue tvk;  
  7. } TKey;  
  8.   
  9.   
  10. typedef struct Node {  
  11.   TValue i_val;  
  12.   TKey i_key;  
  13. } Node;  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedef union TKey {  
  2.   struct {  
  3.     TValuefields;  
  4.     struct Node *next;  /* for chaining */  
  5.   } nk;  
  6.   TValue tvk;  
  7. } TKey;  
  8.   
  9.   
  10. typedef struct Node {  
  11.   TValue i_val;  
  12.   TKey i_key;  
  13. } Node;  



table中的数据只要分为三大部分:metatable,用于管理当前类的操作定义;array明显是数组部分;Node则是常用键值对。待续,得去看看lua用了什么样的哈希函数


标注1 先贴一份引用博客,值得阅读点击打开链接

涉及到弱引用就得联系到内存存储相关。number、bool、string等得清理时交给了C的机制去管理,是C编译器实现的那套,其余使用了数据原子Value的数据对象,都符合弱引用的使用环境。


弱引用有两大已说明的用途:纯数据缓存(cache、备忘录),tabel等对象在命名空间中的管理(对象属性)。

纯数据缓存:比如loadString、loadFile、或如书中提及rgb数据缓存,这样子可以在一个子区域共享同类数据,减少重复操作。在缓 存区中保存只能是弱引用,当外部的强引用全部置为nil时只剩下缓存区的弱引用,则会在下次collectgarbage调用时清理掉这条缓存。

对象属性:因为使用了 Closure相关的技术,同一个table可能处于不同的语法域lexical Scoping,必须要用额外的信息记录这个table的可访问路径。这个属性不属于原table,也不是纯数据的缓存,按照书中说的,应该是在词法域中 增加了当前可访问区域的table记录,这个时候就就得使用外部弱引用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值