C# 堆和栈的简述

来源:互联网 发布:新概念英语配音软件 编辑:程序博客网 时间:2024/05/22 16:51
内存中有一块区域称为栈(Stack),用来存储整形,浮点型,布尔型,字符型等基本数据类型,栈的工作方式很像是弹夹,我们的加子弹和打出子弹,都在弹夹的顶部操作。栈与此类似,压入和弹出数据的操作总是发生在栈的顶部,
操作系统通过栈指针汇总存储的地址读写栈中的数据,当栈为空时,栈指针指向栈的底部,随着数据的不断入栈,栈指针也不断向栈顶部移动,始终指向栈中的下一块自由空间。
栈对数据的操作总是发生在栈的顶部,最后入栈的变量最先弹出,最先入栈的数据最后弹出,因此先入栈数据的作用域总比后入栈的要长,后入栈的数据作用域嵌套在先入栈的数据中,栈的这种工作方式称为后入先出(Last In first out ,LIFO)。
整型,浮点型,布尔型,字符型等简单数据和结构体存储在栈中,称为值类型变量;

栈有非常高的性能,但栈中变量的生存周期都是嵌套的,有时这种要求过于苛刻,在类中,我们希望构造函数创建成员变量后,即使退出构造函数买这些变量仍然存在,其他函数人人可以使用这些变量,为此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)
从上面的例子可以看出,创建引用型变量比创建值类型变量要复杂得多,虽然它会造成一点性能的损失,但可以对数据的生成周期进行非常大的控制。
原创粉丝点击