7.1堆和栈简介
我们把内存分为堆 空间和栈空间。
栈空间比较小,但是读取速度快;堆空间比较大,但是读取速度慢
栈的特征,数据只能从栈的顶端插入和删除;堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除。
CLR的GC(Garbage Collector垃圾回收器)就是内存管理机制。
7.2值类型和引用类型
类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。
值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)。
引用类型需要两段内存,第一段存储实际的数据,它总是位于堆中,第二段是一个引用,指向数据在堆中的存放位置。
当我们使用引用类型赋值的时候,其实是赋值的引用类型的引用(在栈内操作,赋值栈内存放的内存地址),并释放没有引用指向的堆空间。
Vector3 v1 = new Vector3();//定义的类
v1.x = 100;
v1.y = 100;
v1.z = 100;
Vector3 v2 = new Vector3();
v2.x = 200;
v2.y = 200;
v2.z = 200;
v2 = v1;
v2.x = 300;
Console.WriteLine(v1.x);//结果是300,因为v2=v1赋值时,v1和v2的引用都指向同一个堆空间(原来v1指向的
//堆)
如果数组是一个值类型的数组,那么数组中直接存储值;如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)。
Vector3[] vArray = new Vector3[] { new Vector3(), new Vector3(), new Vector3() };
Vector3 v1 = vArray[0];
vArray[0].x = 100;
v1.x = 200;
Console.WriteLine(vArray[0].x);//修改v1.x vArray[].x结果也为200