Lua原理探究-字符串

Lua中的字符串是不可变的,并且通过内化机制减少内存占用。每个字符串变量实际上是引用同一份数据。字符串存储在一个全局散列桶中,新创建的字符串通过散列值定位,避免重复。当字符串数量超过桶数量的一定比例时,桶会自动扩容或缩容,优化查找效率。
摘要由CSDN通过智能技术生成

1:Lua中的字符串实际上是一种被内化的数据。

简单来说,每个存放Lua字符串的变量,实际上存放的并不是一份字符串的数据副本,而是这份字符串数据的引用。每当新创建一个字符串时,首先都会去检查当前系统中是否已经有了一份相同的字符串数据了。如果存在的话就直接引用,将引用指向这个已经存在的字符串数据,否则就重新创建出一份新的字符串数据。

2:字符串在Lua中是一个不可变的数据。

在Lua虚拟机中,有一个全局的地方来存放当前系统中的所有字符串,以便在新创建字符串时,先到这里来查找是否已经存在同样的字符串。

3:Lua虚拟机使用一个散列桶来管理字符串:

前面提到过,Lua会把系统中所有的字符串存放在一个全局的地方,这个全局变量是global_state的strt成员。这是一个散列数组,专门用来存放字符串。
1.当新创建一个字符串时,首先根据散列算法算出散列值。这个值就是strt数组的索引值。
2.如果这里已经有元素,则使用链表将其接连起来。
3.当数据量非常大时,每次查找都会近似退化成一次线性查找。则当字符串数据非常多时,会重新分配桶的数量。
桶扩容的时机:当字符串的数量大于桶的数量,且桶的数量小于MAX_INT/2,则进行翻倍的扩容。
桶缩容的时机:当桶的数量时字符串数量的4倍时,桶的数量将缩小为原来的一半。
总结:
优点:字符串的比较不用像传统字符串比较一样逐未来比较,而是只需要比较两个字符串变量的引用就可以了。即只有一次整数比较的性能开销。
缺点:在创建字符串时,多了一次查找过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值