- 管理方式不同
对于栈来讲,它是由编译器自动管理的,无须手工控制;对于堆来说,它的释放工作由程序员控制,容易产生memory leak。
- 空间大小不同
一般来讲在32位系统下,堆内存可以达到4GB的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定空间大小的。
- 碎片问题
对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而产生大量的碎片,使程序效率降低。对于栈来讲,则不存在这个问题,其原因还是从栈的特殊数据结构说起。栈是一个具有严明纪律的队列,其中的数据必须遵循先进后出的规则,相互之间紧密排列,绝不会留给其他数据可插入的空隙,所以都不可能有一个内存块从栈中间弹出,必须严格按照一定的顺序一一弹出。
- 生长方向
对于堆来讲,其生长方向是向上的,也就是向着内存地址增加的方向增长;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长的。
- 分配方式
堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数完成,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放的,无须手工释放。
- 分配效率
栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,它会分配专门的寄存器存放栈的地址,而且压栈出栈都会有专门的指令来执行,这就决定了栈的效率比较高,堆则是C/C++函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),则可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存了,然后返回。显然,堆的效率比栈要低很多。
-------C/C++知识持续发布中,如果能学到一点点知识,请收藏关注,共同学习进步--------------------