堆的存取是无序的
栈是一种后进先出的数据结构
堆栈其实是栈,栈,堆栈英文都是stack
托管堆是指.net分配引用类型对象的内存区域;
而在.net中的值类型是放在线程栈上的
方法中的变量是要确定内存大小:引用类型
2、 对象的创建方式
MyClass m = new MyClass();
-> new创建了对象(newobj)
-> 构造方法只是做了初始化
1、首先new向操作系统申请内存
2、计算构造方法的继承关系中所有字段的字节数.
3、预算满足"字节数 + 常量 + 8"满足被4正处的最小数
4、如果操作系统内存不够了,报异常
5、如果内存够了,就返回一个地址
6、在托管堆中有一个指针对对象的维护
7、 指针对象一般指向一个可用内存,如果申请100字节,那么指针对象会返回当前地址,并下移100字节
8、 在返回100个字节空间的时候,由构造方法将内存初始化,返回首地址
9、交给引用类型变量
10、 对象创建完毕
ref参数的变量必须声明赋值后再传入方法是用,out参数的变量可以不赋值,但是必须在方法中赋值
装箱是:在托管堆中分配内存,内存的大小是值类型中各个字段的内存和 加上类型对象指针和同步索引块, 然后复制到托管堆内存,然后返回对象地址。这个地址就是对一个对象的引用。
拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用类型值转换为值类型并给值类型变量。
装箱操作和拆箱操作是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。