一:C#语言中的数据类型
C#的数据类型分为两类:值类型(基本的数据类型)和引用类型
值类型:byte,int,float,bool,struct.....
引用类型:string,数组,自定义的类,内置的类.....
二:堆和栈
我们把内存分为堆空间和栈空间
栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢
栈只能从栈顶插入或删除元素,类似于桶装的薯片,先进后出
堆能够以任意顺序插入或删 除元素,堆里面的每一个元素都是程序中的一个引用
三:GC的简介
CLR中的GC(Garbage Collector 垃圾回收器)就是内存管理机制,C#中不需要我们关心内存的使用,因为CLR帮我们做了
例如在堆中一共有两个对象被程序引用着,当其中一个对象的引用断开,GC发现没有对象引用着它,那么会自动释放它的内存,释放后这块内存可以被重用
四:值类型和引用类型
值类型只需要一段单独的内存去存储实际的数据,一般在栈中存储
引用类型需要两段内存,一段存储实际的数据,在堆中存储,另一段是一个引用,在栈中存储,指向数据在堆中的存放位置(内存地址)
可以拿在一个盒子里装吃的来分析:
值类型就是在盒子里直接放了吃的
引用类型是在盒子里放了一张纸条上面写着吃的在哪一个盒子里
Q:Unity中为什么不能对transform.position.x直接赋值?
五:几种不同情况下的内存存储
——第一种
当Test方法执行后会先清空栈中的内存,首先清空name的内存地址,然后清空bool类型变量c的内存,清空char类型变量b的内存,清空int类型变量a的内存,最后GC的引用计数器发现string类型liu的引用数为0,则释放堆中string类型liu的内存
——第二种(正常的引用类型)
当使用引用类型赋值时,其实赋值的是引用类型的引用(地址),并不是实际值
当str[0]赋值b1时,操作的其实是同一块内存空间,并不是操作的新的内存空间
——第三种(特殊的引用类型,string类型比较特殊)
当使用引用类型赋值时,其实赋值的是引用类型的引用(地址),并不是实际值
当str赋值chen时,是系统在堆中又开辟了一段新的内存空间去存储string类型chen的实际值
——第四种(比较容易混淆的)
v1,v2都是自定义类型,为引用类型,当执行v1=v2时,v1与v2的内存地址都引用了同一块堆中的实际内存区域,所以操作v1.x就相当于操作v2.x
——第五种
如果数组中的值是值类型,那么数组中直接存储值
如果数组中的值是引用类型,那么数组中存储的是引用(内存地址)
当执行Vector3 v1=v[0]时,v1的内存地址引用了堆中内存地址1,所以执行v[0].x与v1.x都是操作同一块内存空间