Lua 5.4引入的新变动
Lua 5.4引入的新变动
- 新的分代模式垃圾回收 (new generational mode for garbage collection)
在分代模式下,收集器频繁进行次要收集,仅遍历最近创建的对象。如果在次要收集之后对内存的使用仍然超出限制,则收集器将进行一次世界停止的主要收集,该遍历将遍历所有对象。分代模式使用两个参数:次要乘数和主要乘数。
次要乘数控制次要收集的频率。对于次要乘数x,当内存增长到前一个主要集合之后使用的内存大x%时,将进行新的次要集合。例如,对于20的乘数,当内存使用量比上一个主要收集之后的使用量大20%时,收集器将进行次要收集。默认值为20;默认值为20。最大值为200。
主乘数控制主集合的频率。对于主乘数x,当内存增长到前一个主集合之后使用的内存大x%时,将进行新的主集合。例如,对于100的乘数,当内存使用量大于上一次收集之后的两倍时,收集器将进行主收集。预设值为100;最大值为1000。
分代模式垃圾回收对以Lua为主的项目是有好处的,分代的机制能减少对不需要回收对象的遍历,提升垃圾回收的速度.
-
to-be-closed特性 (to-be-closed variables)
Lua引入了新的语法——特性,我觉得这在Lua的变动中是最新鲜的部分,特性可以让对象具有更加特别的行为,期待Lua后续的更新中带来更多的特性.
to-be-closed特性是让lua的对象具有终结器一样的功能,当变量超出访问范围后即会触发其__close
元方法.do local obj<close> = xxxx end -- 当 obj 不可访问时就会调用其 __close 原方法
-
局部常量 (const variables)
const
特性使变量在声明后不可以再次改变其值.对Lua这样的语言,引入这个特性感觉只是性能上的考虑.
const特性变量是编译器变量VCONST, /* compile-time <const> variable; info = absolute index in 'actvar.arr' */
do local my_value<const> = xxxx -- 其后无法再对my_value 赋值 end
-
userdata可以有多个user values(userdata can have multiple user values)
对于只用Lua写逻辑的人,不太清楚这个变动的影响
-
math.random
新的实现 (new implementation for math.random)Lua现在基于[xoshiro256]算法实现快速的伪随机数生成(https://en.wikipedia.org/wiki/Xorshift#xoshiro256)
更加可靠的随机算法,对游戏有好处,之前Lua虚拟机每次重启后随机出来的值都是一样的Lua 5.3的随机:
现在Lua 5.4 每次随出来的就是不一样的
-
警告系统 (warning system)
通过
warn(msg1,...)
发出一条警告信息,按照惯例,以@
开头的单条消息旨在作为控制消息,它是警告系统本身的消息.特别地,标准的Lua warning 函数,
特别是,Lua中的标准警告功能会识别控制消息“ @off”,以停止发出警告,并识别“ @on”,以(重新)开始发出警告;它忽略未知的控制消息。> warn("@on") > warn("2020年只剩下40天啦!时间: ",os.date() ) Lua warning: 2020年只剩下40天啦!时间: 11/08/20 23:29:34 > warn("@off") >
-
关于函数参数和返回值的Debug信息(debug information about function arguments and returns)
(略)
-
整数“for”循环的新语义 (new semantics for the integer 'for' loop)
(没看到这个啥意思)
-
string.gmatch
新增了一个可选的init
参数 (optional 'init' argument to 'string.gmatch') -
close特性引入的新函数 (new functions 'lua_resetthread' and 'coroutine.close')
-
字符串到数字的强制转换转移到字符串库中(string-to-number coercions moved to the string library)
-
缩小内存块时分配功能失败(allocation function allowed to fail when shrinking a memory block)
-
string.format
的新格式(new format '%p' in 'string.format') -
utf8库最多接受代码点到2^21(utf8 library accepts codepoints up to 2^31)