Lua设计与实现读书笔记
简介
lua设计与实现的摸鱼笔记。主要是为了记录那些我觉得比较重要的东西。
本书的实现由为Lua5.1,后续可能会存在区别。
比如说Lua5.1的gc方式是三色标记,而后续是引用。
入门的话我推荐《Lua程序设计》搭配简介 · GitBook (shenjun-coder.github.io)进行学习。
同时后续也可以看一下云风的 BLOG (codingnow.com)。
基础数据类型
字符串
性能优化
因字符串拼接会产生新的字符串,所以会对性能上有所影响。
比如说:
a = os.clock() |
这段代码使用字符串拼接来生成新的字符串。
a = os.clock() |
这段代码使用table来模拟字符串,避免使用拼接,很明显性能得到了很大的提升。
表
操作算法
查找
查找的伪代码大概如下:
- 输入的key为正整数,并且它的值大于0并且小于等于数组大小,那么他会尝试在数组部分查找。
- 否则会尝试在散列表部分进行查找,首先会计算出该key具体的散列值,再根据散列值得到桶所在的位置,遍历该散列桶下所有的链表元素,直到找到该key为止。
可以从上发现,即使是一个正整数的key,他也不一定会存储在数组部分,这完全取决于当前数组大小。
比如说,下面代码便会发现只有1作为数组部分存储下来了,而100存储在散列表部分。
local t = {} |
既然涉及到这种数据是如何进行存储的,那最佳的方案就是去看元素是如何增加的。
新增元素
取长度
--如果表存在数组部分: |
可以看出,如果表中同时拥有数组和散列表的数据,那么会优先取数组部分的长度。
Lua 虚拟机
指令格式
可以看出Lua的指令是32位的,从低位到高位开始解析。
首先,最低位是OpCode,称为操作数,接下来就是A,B,C参数。
列出目前所有的指令。这个枚举可以直接从lopcodes.h
从寻找。
typedef enum { |
再这些指令中,有不同的取值方式,具体可以看下图。
附录
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 好饿殿の小屋!