堆栈综合详解

来源:互联网 发布:mac桌面两个窗口 编辑:程序博客网 时间:2024/05/20 17:25

在计算机科学中,堆栈可以有2中解释:
一、2种数据结构:
堆是一种特殊的树形数据结构,通常是指二叉堆,堆排序。
栈是限定仅在表尾进行插入或删除操作的线性表。栈的修改是按后进先出的原则进行的。因此,本又称为后进先出(Last In First Out)的线性表(简称LIFO结构)。
详情参考:http://knowmore.blogbus.com/logs/12726555.html

二、用于动态分配的内存空间 :即是开发中经常混淆的引用类型和值类型存放的堆栈问题
 堆(heap):是可动态增长的一维连续空间,用于存放程序中的动态数据。
不同的是本地堆需要程序员自己管理,自己申请的空间,自己负责回收;在.NET中又有托管堆,.NET运行支持环境负责管理托管堆,你只管申请用,平台的垃圾回收机制会帮助程序员释放没有被引用的堆资源。
C#当中,new申请的都是托管堆空间。在CLI/C++中,new申请的是本地堆,gc new申请的是托管堆。
 栈(stack):— 由系统自动分配释放 ,存放函数的参数值,局部变量的值等。所以局部变量等会及时回收,释放。
 

堆和栈里都存放些什么呢:

当我们的代码执行的时候,栈和堆中主要放置了四种类型的数据:值类型(Value Type),引用类型(Reference Type),指针(Pointer),指令(Instruction)。

1.值类型:

在C#中,所有被声明为以下类型的事物被称为值类型:

bool  byte  char decimal double enum float int long sbyte short struct uint ulong ushort

2.引用类型

所有的被声明为以下类型的事物被称为引用类型:
class  interface   delegate  object  string

3.指针

在内存管理方案中放置的第三种类型是类型引用,引用通常就是一个指针。我们不会显示的使用指针,它们由公共语言运行时(CLR)来管理。指针(或引用)是不同于引用类型的,是因为当我们说某个事物是一个引用类型时就意味着我们是通过指针来访问它的。指针是一块内存空间,而它指向另一个内存空间。就像栈和堆一样,指针也同样要占用内存空间,但它的值是一个内存地址或者为空。

 

4.指令
哪些放在堆中哪些放在栈中:
黄金法则:
1. 引用类型总是放在堆中

2. 值类型和指针总是放在它们被声明的地方。
当值类型数据在方法体中被声明时,它们都是被放置在栈上的。
值类型数据有时也被放置在堆上。记住这条规则--值类型总是放在它们被声明的地方。好的,如果一个值类型数据在方法体外被声明,且存在于一个引用类型中,那么它将被堆中的引用类型所取代。

 

由以上可以明白为什么C#变量函数执行完后悔自动释放资源,因为是存放在栈中。 而类对象等引用类型执行后仍可以使用是因为存放在堆中,可以程序员自由释放也可有托管堆等来释放。

 

参考:http://koudai.qihoo.com/u/33391130/article_249013244.html?fp=1

其它参考资料:
http://www.cnblogs.com/yangjunwl/archive/2008/01/08/1029903.html
http://blog.csdn.net/anlen26/archive/2009/01/13/3769660.aspx
.NET 代码在堆栈中的执行流程可以参考http://blog.csdn.net/shao5155285/archive/2010/05/18/5604162.aspx

http://blog.csdn.net/shao5155285/archive/2010/05/18/5603253.aspx

原创粉丝点击