C#/.NET引用类型的内存分配 http://c.biancheng.net/view/3073.html
详细案例分析:
namespace TypeCSharp{class Program{static void Main(string[] args){Student stu ;stu = new Student();Student stu2;stu2 = stu;}}class Student{uint ID;//值类型(32位)ushort Score;//值类型(16位)}}
(1)Student stu 的实际过程:
①计算机先去找到空余内存,再去看是什么类型,发现是“引入类型”。
②计算机系统看到你是引入类型,立刻为你分配4个字节(32bit)的内存。
备注:32位系统会分32位来存储内存地址,64位系统会分64位存储。
③然后把里面的统统刷成0。
(2)stu = new Student(); 的实际过程:
①new Student()表示真正在堆内存里面创建实例,这个实例才真正保存实例内的字段。
堆里边创建实例,也需要寻找哪的内存是空闲的。此时才是真正计算Student这个类型需要多少内存空间。
②分配完实例的堆内存地址 保存在 stu变量里边。
注意区分好,本案例分配内存:前4×8(32bit)保存ID;后2×8(16bit)保存Score。
>
对应二进制
转换成
(从后往前数8位为一字节)
此时储存的值,就是我们实例所在的堆内存的地址的值
备注:栈中保存堆的地址
(3)创建新的实例,得出关系如下:
new Student()中,(uint ID)(ushort Score)分别占据前4字节、后2字节。
得出结论:引用类型实际上就是引用实例地址。
