首页 > 代码库 > Heap与Stack的区别

Heap与Stack的区别

堆栈的区别:

  一、堆栈空间分配区别:

  1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈; 
  2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

  二、堆栈缓存方式区别:

  1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放; 
  2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

  三、堆栈数据结构的区别:

  堆(数据结构):堆可以被看成是一棵树,如:堆排序; 
  栈(数据结构):一种先进后出的数据结构。

Java中堆与栈的区别:

  栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 
  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 
  堆内存用来存放由new创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 

C++中堆与栈的区别:

  1、管理方式不同;  
    2、空间大小不同;  
    3、能否产生碎片不同;  
    4、生长方向不同;  

  5、分配方式不同;  

    6、分配效率不同;

  管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆 来说,释放工作由程序员控制,容易产生memory leak。  

     空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角 度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间 

  大小的,例如,在VC6下面,默认的栈空间大小是1M

  碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因 

  为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内 存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,

  生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。 

  分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈 
      的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系 
      统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这 
     样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。  

 

Heap与Stack的区别