.Net中值类型和引用类型

装箱 就是把“值类型”转换成“引用类型”(Object);

拆箱 就是把“引用类型”转换成“值类型”;

引用类型:基类为Objcet

值类型:均隐式派生自System.ValueType: 

值类型:byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型

引用类型:string 和 class统称为引用类型。

说起值类型和引用类型就会说到堆和栈的问题,那什么是堆什么是栈呢?他们之间又有什么区别的呢?

https://www.cnblogs.com/lanr/articles/5723920.html

1、堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

2、堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

3、效率比较

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

4、存储内容

栈: 在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向函数的返回地址,也就是主函数中的下一条指令的地址,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排

 

猜你喜欢

转载自www.cnblogs.com/gyjjyg/p/12442774.html
今日推荐