lua中的string类型

在lua中用union TString来表示字符串类型

lobject.h:

其中结构体tsv中 reserved字段表示字符串是不是保留关键字,hash是其哈希值,len是其长度。我们在TString中没有看到lua将字符串的内容存在任何地方啊,其实lua是将内容同一存在了另一个地方,global_state中的strt里面:

lstate.h:

lstate.h:

其中字段hash为二维数组,这里面保存了lua中所有的字符串。接下来让我们来看看lua是怎样生成一个字符串的吧:

lstring.h:

lua利用luaS_new来new一个string,而真正new string的是在函数luaS_newlstr中:

lstring.c:

首先计算出字符串的hash值,然后代码G(L)->strt.hash[lmod(h, G(L)->strt.size)]找出hash的对应位置,这个哈希表是链表实现的,因此在for循环中查找链表,当链表中已经存在对应的字符串时做一些判断然后返回这个已经存在的字符串指针TString *,若不存在则使用newlstr来new一个字符串并将其加到global_state中的strt中。

lstring.c:

时间: 2024-10-08 06:18:07

lua中的string类型的相关文章

lua中打印所以类型功能实现table嵌套table

lua中打印所以类型功能实现 本人测试 number.string.bool.nil.table嵌套table.userdata没问题 共享一下有什么问题请拍砖 代码如下 cclog = function( ... ) local tv = "\n" local xn = 0 local function tvlinet(xn) -- body for i=1,xn do tv = tv.."\t" end end local function printTab(i

C++中关于string类型究竟能不能用cout输出的问题

先让我讲下故事哈 一次在MFC中用cout输出一个string类型字符串,编译时出现这样一个错误: error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or

java 中的String类型

java 中的String类型   (1)String类型的数据可以表示所有的数据类型. (2)String中的字符串常量与一般的字符串:                String str0 = "hello";//字符串常量“hello”被预先放到了数据段的字符串常量池中                String str1 = "hello";//直接从常量池中寻找已有的字符串常量                String str2 = new String

C#中的String类型

C#中的String类型,其实是引用类型,String对象被分配在堆上,而不是栈上.因此,当把一个字符串变量赋予另一个字符串时,会得到对内存中同一个字符串的两个引用.但是,String与引用类型在常见的操作上有一些区别.例如,字符串是不可改变的.修改其中一个字符串,就会创建一个全新的String对象,而另一个字符串不会发生任何变化.如下列代码: string a = "a1"; string b = "b" + a; Console.WriteLine("

c/c++中关于String类型的思考

首先说明:String并不是一种内置类型,因此任何通过String声明出来的实例都不是一个变量,不同于内置类型因此String仅仅能称之为一种特殊的型别,没错String是一个类类型. 一般来说c语言里面是没有类和对象概念的,那么提供给c语言一个<string.h>头文件是做什么用的呢,如果研究过C++中String的构造那么应该会清楚string的底层依赖的就是内置类型的型别char *指针,所以显而易见开放<string.h>接口库给c语言就是为了处理char *字符串时能够很

[每天一个知识点]18-Java语言-在switch中接受String类型

在Java7中增加了一个新特性,switch可以接受String类型的变量,这就省下了书写大量if ("xxx".equals(yyy))的繁复工作.示例代码就免了,仅仅是一个数据类型的改变而已,如果会用原来的switch而在5分钟内搞不定String类型的switch,建议还是放弃做程序员吧-- 至于内部实现,java一点都没增加新内容,其实代码是被转换成了这个样子 switch (xxx.hashCode()) { case 1024: // 假设原来是"aaa"

如何在ArrayList&lt;Integer&gt;中添加String类型数据

黑马入学测试题: ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象. package itheima; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; /** * 在这个泛型为Integer的ArrayList中存放一个St

java中关于String 类型数据 的存储方式

Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太 明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容. String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为 String Constant Pool.好像没有正式的命名?? 在java编

C# 中的 String类型分析

equals方法和==的区别 首先大家知道,String既可以作为一个对象类来使用,又可以作为一个基本类型来使用.这里指的作为一个基本类型来使用只是指使用方法上的,比如String s = "Hello",它的使用方法如同基本类型int一样,比如int i = 1;,而作为一个对象来使用,则是指通过new关键字来创建一个新对象,比如String s = new String("Hello").但是它的内部动作其实还是创建了一个对象,这点稍后会说到. 其次,对Stri