越详细越好,最好举个例子

解决方案 »

  1.   

    To: int64(@163.com)
    老兄,是否有误,记得数据结构中 栈是先进后出!队列是先进先出
    队列是否对应.NET中的堆?
      

  2.   

    栈存数值类型(如int)
    堆存引用类型(如class)
      

  3.   

    堆和栈是两种我们最常用的两种数据结构,数据结构有好多,我们想到的任何一种数据的组织处理形式都是数据结构。
    1、从CPU层次讲
    堆和栈已经常用到CPU的指令中直接得到了支持。
    (堆和栈的数据结构特性我就不说了,任何一本讲数据结构的书上都讲的很详细)
    CPU对栈的支持就是堆栈指令push、pop等,堆实际就是一块还没有被进行任何组织的内存。可以说整个内存就是一个大堆。从堆中取出一块,让它按照栈的存取方式来存取,这就是成了栈。
    2、从操作系统层次讲
    操作系统增加了对虚拟内存的管理。我们所操作已不在上真正的内存。拿win32来说,就是一个最大4G的虚拟空间,我们可以在这个虚拟空间中进行堆与栈的操作,当然我们的操作都是虚拟的,实际的操作还要操作帮助完成。
    操作系统对内存进行了有效管理,独立管理。进程与进程之间是分开的,每个进程都有它的堆,如每个进程都有默认堆。其实我们甚至可以把进程内没有被分配的内存都看成堆,你都可以自由索取内存。我们知道线程都有它的栈(这里有个容易犯的错误,有的人看见说函数的参数要进栈出栈就说函数有栈,错,函数用的栈是它所属的线程的。)我们可以这样理解,栈就是从堆这样一块虚拟大内存中分出一块,按照栈的规则操作的一块内存,以后我们就可以对这块内存进行push和pop等操作了。
    3、从程序员编程层次讲
    我们程序员只要知道,对于内存这样一个重要的东西,系统给我们提供了两种重要且常用的数据结构。汇编语言中,对栈的操作就是push和pop,以前说的push和pop都是数据结构中概念上的,这里才是对栈真正的push和pop。对于堆的操作,其实就是直接操作地址。对于高级语言,比如c,对于栈的操作道是给隐藏了,只要我们int a;就可以把变量a压入栈中,对于堆的操作变成了成对的new和delete,我们要用的话需要先申请,不向汇编语言直接用.申请是因为让操作系统知道,操作系统要对内存进行管理.