C# 堆和栈的简述

2020-11-10 14:57发布

内存中有一块区域称为栈(Stack),用来存储整形,浮点型,布尔型,字符型等基本数据类型,栈的工作方式很像是弹夹,我们的加子弹和打出子弹,都在弹夹的顶部操作。栈与此类似,压入和弹出数据的操作总是发生在栈的顶部,

栈有非常高的性能,但栈中变量的生存周期都是嵌套的,有时这种要求过于苛刻,在类中,我们希望构造函数创建成员变量后,即使退出构造函数买这些变量仍然存在,其他函数人人可以使用这些变量,为此C#把类的成员变量存储在堆(Heap)上;

栈操作的主要方法:

1,Push()入栈(添加数据)

2,Pop()出栈(删除数据,返回被删除的数据)

3,Peek()取得栈顶的数据,不删除

4,Clear()清空所有数据

5,Count取得栈中数据的个数



堆的工作方式与栈截然不同,

看个例子吧:

{

Cat Grafield= new Cat (“Grafield”,4);

}

创建了一个名为cat的Cat类对象,这个过程分为两步:

1,系统在堆中划分了一快20字节的空间用于存储Grafield对象的成员变量,并调用构造函数初始化对象的成员变量

2,系统在栈中分配了4字节的空间,存储Grafield对象在堆中的首地址,

栈中存储的指向堆中对象的地址为引用,系统通过引用找到堆中的对象

所有的对象都存储在堆中,数组也存储在堆中,它们都称为引用型变量(Reference type)

从上面的例子可以看出,创建引用型变量比创建值类型变量要复杂得多,虽然它会造成一点性能的损失,但可以对数据的生成周期进行非常大的控制。




作者:Czhenya

链接:https://blog.csdn.net/Czhenya/article/details/77858169

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。