C#/.NET引用类型的内存分配 http://c.biancheng.net/view/3073.html

详细案例分析:

  1. namespace TypeCSharp
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. Student stu
  8. stu = new Student();
  9. Student stu2;
  10. stu2 = stu;
  11. }
  12. }
  13. class Student
  14. {
  15. uint ID;//值类型(32位)
  16. ushort Score;//值类型(16位)
  17. }
  18. }

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