LuaJIT源码分析
文章平均质量分 96
异次元的归来
Game_Develop_Forever
展开
-
LuaJIT源码分析(三)字符串
由于每次新建字符串时都需要计算一次hash,这个函数调用会比较频繁,因此它是一个稀疏的hash函数,内部实现使用了lookup3 hash算法,只会取字符串中的常数个字节进行计算,所以函数的运行是一个常数的时间。lua的字符串是内化不可变的,也就是lua字符串变量存放的不是字符串的拷贝,而是字符串的引用。tab字段保存了所有字符串,它是个链表数组,每个新建的字符串先根据hash算法计算出自身的hash值,再根据当前StrInternState的mask,得到数组的索引,如果已经有元素,就插入到链表的头部。原创 2024-05-02 16:36:15 · 1008 阅读 · 0 评论 -
LuaJIT源码分析(二)数据类型
nil和bool类型是值类型,无需gc管理,而light userdata的定义就是外部管理的对象,只是将指针传给了lua,所以也不受lua的gc管理。的实现也比较巧妙,它不是直接去判断TValue是否为一个非NaN的double,而是尝试取出它的itype,如果itype比最后一个定义的LJ_TISNUM都还要小(注意itype的定义都是取反过的),那么说明它必定不是一个合法定义的TValue类型,也就只能是个double了。换句话说,只要满足这个条件,剩下的51位尾数,完全可以用来编码其他的数据。原创 2024-04-01 23:14:22 · 1057 阅读 · 0 评论 -
LuaJIT源码分析(一)搭建调试环境
浏览这个脚本,可以发现LuaJIT的编译分为三个部分,首先是build出一个minilua,它是lua原生代码的一个子集,用来判断当前平台是32位还是64位,并执行lua脚本并生成平台相关的指令;最后编译lua的各种lib,然后生成最终的LuaJIT。另外,脚本在编译结束时,会执行一些清理工作,把中间生成的代码,以及编译产生的obj都会删除掉。然后,我们在src同级目录下新建一个目录,用来存放vs工程,在vs中新建一个empty console C++工程,然后把src目录的头文件和源文件都添加进去。原创 2024-03-03 14:22:09 · 1399 阅读 · 0 评论