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字节。
得出结论:引用类型实际上就是引用实例地址。