码迷,mamicode.com
首页 > 编程语言 > 详细

C++堆和栈的区别

时间:2018-11-03 23:16:15      阅读:372      评论:0      收藏:0      [点我收藏+]

标签:数据结构   数据段   title   寄存器   调用   空间   指令   就是   堆和栈的区别   

总述

C++中堆和栈主要有以下几点不同:

  1. 管理方式不同
  2. 空间大小不同
  3. 能否产生碎片不同
  4. 生长方向不同
  5. 分配方式不同
  6. 分配效率不同

详情

管理方式:对于栈来讲,是由编译器自动管理,无需手动控制;对于堆来说,分配和释放都是由程序员控制的。

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

碎片问题:对于堆来讲,由于分配和释放是由程序眼控制的(利用new/delete 或 malloc/free),频繁的操作势必会造成内存空间的不连续,从而造成大量的内存碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的数据结构,在某一对象弹出之前,它之前的所有对象都已经弹出。

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

分配方式:堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配;动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器实现的,无需我们手工实现。

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


参考文献

http://www.cnblogs.com/hanyonglu/archive/2011/04/12/2014212.html

C++堆和栈的区别

标签:数据结构   数据段   title   寄存器   调用   空间   指令   就是   堆和栈的区别   

原文地址:https://www.cnblogs.com/ovs98/p/9902226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!