Lua设计与实现---字符串

一,简介

    每个存放lua字符串的变量,实际上存放的并不是一份字符串的数据副本,而是这份字符串数据的引用。在这个理念下,每当新创建一个字符串时,首先都会去检查当前系统中是否已经有一份相同的字符串数据了。如果存在的话就直接使用,将引用指向这个已经存在的字符串数据,否则就重新创建一份新的字符串数据。因此,字符串在lua中是一个不可变的数据,改变一个字符串变量的数据并不影响原来字符串的数据。

二,举一列例子

a = "1"

a = a.."2"

第一行代码创建了一个变量啊,只想字符串"1",而在第二行代码中,我么使用..字符串连接字符,将变量a后面连接了字符串"2"。第二行代码对变量a的重新修改,并没有影响第一行代码的字符串"1"。换言之,此时系统中存在两个字符串:"1"和"2"。


而前面生成的字符串"1",如果其他地方没有引用用它的话,将在GC阶段北回收。

三,原因

缺陷------在创建一个新的字符串时,首先会先查系统中是否有相同的数据,只有不在的情况下才创建,这与直接创建字符串相比,多了一次查找过程。好在lua实现中,查找一个字符串的操作小号并不大。

主要有一下几点:

1.在lua虚拟机中存在一个全局的数据区,用来存放系统中的所有字符串。

2.同一个字符串数据,在lua虚拟机中之可能有一份副本,一个字符串一旦创建,将是不可变的。

3.变量存放的仅是字符串的引用,而不是实际内容。

四,优化

有了以上的认知,不难理解在lua中,应该尽量少的使用字符串连接操作符,因为每一次都会生成一个新的字符串。我们应该使用table来模拟字符串缓冲区,避免了大量使用连接操作符

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容