什么是栈和堆
栈:全称是线程堆栈,英文 Stack;栈空间比较小,但是读取速度快。
堆:全称是托管堆,英文Heap;堆空间比较大,但是读取速度慢。
解释1:
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
解释2:
存放在栈中时要管确定存储顺序,保持着先进后出的原则,它是一片连续的内存域,由系统自动分配和维护。而堆是无序的,它是一片不连续的内存域,由有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,系统将会通过垃圾回收器(GC)来回收。
栈和堆的区别
1.栈
栈的特征:先进后出。
数据只能从栈的顶端插入和删除,把数据放入栈顶称为入栈(push),从栈顶删除数据称为出栈(pop)。
2.堆
堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除。
3.值类型和引用类型
C#中类型被分为两种:值类型(整数,小数,bool,struct,char )和引用类型(string,数组,自定义的类,内置的类)。
1)值类型只需要一段单独的内存,用于存储实际的数据。
2)引用类型需要两段内存。第一段存储实际的数据,它总是位于堆中,第二段是一个引用,指向数据在堆中的存放位置。
即:C#中值类型的值存在栈上;引用类型的值存在堆上,栈上存引用。将一个值类型变量赋值给另一个值类型变量时,将赋值包含的值。而引用类型变量的赋值只复制对象的引用,而不复制对象本身。值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。
栈通常保存着我们代码执行的步骤,而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着是下一个。堆则不然,它像是一个仓库,储存着我们使用的各种对象等信息,而且它们被调用完毕不会立即被清理掉。栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbage collection:垃圾收集器)清理。