读书笔记<> 理解堆与堆栈

mac2022-07-05  36

获得问题

第二章理解.NET Framework提到通用类型系统CTS,.net支持两种类型值类型存储在堆栈中,引用类型存储在堆中;

以前学数据结构的时候就没能很好的理解,现在得巩固巩固^_^

网上搜索阅读资料 相当好的一篇文章:C#的内存管理:堆栈、托管堆与指针还有这位朋友的解释:

 

  首先来说说堆栈。     而要理解堆栈,先得了解C语言那种基于函数的编程方式。         我们知道,C语言的程序是由一个一个的函数构成的,程序从主函数main开始执行,在main中不断的调用其它的函数,进行输入输出及完成一系列的任务,最后完成。         在函数中定义的变量,称为函数内部变量,内部变量不可被函数外的代码访问,并且在函数执行完毕后就全部都被销毁(除非是静态的)。         堆栈就是非常适合于这种函数调用的一种内存分配方式。堆栈通过两个方法对内存进行分配和处理,Push和Pop。Push方法用于将一段数据压入堆栈,而Pop用于从堆栈中弹出一段数据。更重要的是,堆栈是先进后出的一个东西,这就是说,你最先Push进去的数据,将最后被Pop出来。             堆栈与函数的调用的关系:     我们知道,当在程序中调用一个函数的时候,程序就会跳到被函数的入口继续执行,而在调用之前所有的内部变量都将保持状态和数据直到函数调用结束。而用堆栈就很简单和高效的解决了内部变量的保持和销毁。         当C语言程序要调用一个函数时,就会把这个函数所有的参数全部Push到堆栈中,函数再将自己所有的内部变量也都Push到堆栈中。在函数执行完后,函数再将自己所有的内部变量全部Pop出来,再Pop掉所有的参数。如果函数内部又调用了函数,那么又会重复前面的过程。。。。。

 

受益匪浅回过头来在看看自己写的一段c#程序

 

 1 public  partial  class  Form1 : Form  2      { 3        public Form1() 4        { 5            InitializeComponent(); 6        } 7 8        int a=1; 9        private void Form1_Load(object sender, EventArgs e)10        {11            int b = 2;12            b = a;13        }14} 15

a,b同为int值类型,而a属于Form1类它会被一起存储在Form1类的实例对象所存储的托管堆上而b属于局部变量这被存储在堆栈中,Form1_Load事件完成就会被Pop栈,上面提到的文章中对栈解释相当精华的一段:

栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C / C ++ 中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。

栈的优势只是改变指针就能销毁内容,c#也可以运用栈的优势写不安全代码,在unsafe代码块这样的实现

double *  pDouble = stackalloc   double [ 50 ]

呵呵至于什么情况用上,还真希望在实际的应用中有机会实践实践.....有些跑题了还是继续看完这本<<技术参考大全ADO.NET>>继续应聘来学校招聘的公司,明天会来一个深圳信天游公司,可惜招的主要是java手机游戏开发,wap开发.net做wap不是很容易?矛盾啊要是应聘上了不是得改学java?????????

转载于:https://www.cnblogs.com/cgy985/archive/2007/11/19/964686.html

最新回复(0)