堆分配内存和栈分配内存区别问题
堆是先存储高位,然后依次往下存,是先进先出的,栈是先存储高位,后有新数据时,依次往下移动,最后进入内存的占据高位,是先进后出,不知我理解的对不对?

解决方案 »

  1.   

     栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。  栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
      栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。
      栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
      1、进栈(PUSH)算法
      ①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
      ②置TOP=TOP+1(栈指针加1,指向进栈地址);
      ③S(TOP)=X,结束(X为新进栈的元素);
      2、退栈(POP)算法
      ①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
      ②X=S(SOP),(退栈后的元素赋给X);
      ③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
      栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
     堆用于动态分配和释放程序所使用的对象。
        1.事先不知道程序所需对象的数量和大小。 
      2.对象太大,不适合使用堆栈分配器。
      堆使用运行期间分配给代码和堆栈以外的部分内存。
      传统上,操作系统和运行时库随附了堆实现。当进程开始时,操作系统创建称为进程堆的默认堆。如果没有使用其他堆,则使用进程堆分配块。语言运行时库也可在一个进程内创建单独的堆。(例如,C 运行时库创建自己的堆。)除这些专用堆外,应用程序或许多加载的动态链接库 (DLL) 之一也可以创建并使用单独的堆。Win32 提供了一组丰富的 API 用于创建和使用专用堆。有关堆函数的优秀教程,请参阅 MSDN 平台 SDK 节点。
      当应用程序或 DLL 创建专用堆时,这些堆驻留于进程空间中并且在进程范围内是可访问的。某一给定堆分配的任何数据应为同一堆所释放。(从一个堆分配并释放给另一个堆没有意义。)
      在所有虚拟内存系统中,堆位于操作系统的虚拟内存管理器之上。语言运行时堆也驻留在虚拟内存之上。某些情况下,这些堆在操作系统堆的上层,但语言运行时堆通过分配大的块来执行自己的内存管理。绕开操作系统堆来使用虚拟内存函数可使堆更好地分配和使用块。
      典型的堆实现由前端分配器和后端分配器组成。前端分配器维护固定大小块的自由列表。当堆收到分配调用后,它尝试从前端列表中查找自由块。如果此操作失败,则堆将被迫从后端(保留和提交虚拟内存)分配一个大块来满足请求。通常的实现具有每个块分配的开销,这花费了执行周期,也减少了可用存储区。
      Windows NT 的实现(Windows NT 4.0 版及更高版本)使用 127 个从 8 到 1,024 字节不等的 8 字节对齐块的自由列表和 1 个混合列表。混合列表(自由列表[0])包含大小超过 1,024 字节的块。自由列表包含在双向链接表中链接在一起的对象。默认情况下,进程堆执行合并操作。(合并操作是组合相邻的自由块以生成更大的块的操作。)合并操作花费了额外的周期,但减少了堆块的内部碎片。
      单个全局锁可防止多线程同时使用堆。此锁主要用于保护堆数据结构不受多线程的任意访问。当堆操作过于频繁时,此锁会对性能造成负面影响。
    应该对你有帮助!