浏览了网上很多关于堆栈的区别,在此记录一下,以便学习。
1、管理方式不同
对于栈,由编译器自动管理,无须我们手工控制,对于堆,分配释放工作由程序员控制,容易产生内存泄漏。
2、空间大小不同
栈的空间比较小,堆的比较大
3、碎片问题
对于堆,频繁的new/delete会造成内存空间的不连续,从而产生内存碎片,使程序效率降低。
对于栈,先进后出,栈顶出栈,不会出现栈中间弹出内容,所以不会出现内存的不连续,不会出现碎片问题。
4、生长方向不同
对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
5、分配方式不同
对于堆,是动态分配的,没有静态分配。
对于栈,有2种分配方式,动态分配与静态分配。静态分配是编译器完成的。动态分配由函数进行分配,但是栈的动态分配和堆是不同的,栈的动态分配是由编译器进行释放,无需我们手工控制。
6、分配效率不同
栈是机器系统系统的数据结构,计算机会在底层对栈提供支持,压栈出栈都有专门的指令执行,所以栈的效率比较高。
堆是c/c++库函数提供的,堆的机制很复杂,例如为了分配一块内存,库函数需要按照一定的算法在堆中搜索可用的足够大小的内存空间,如果没有足够的内存,有可能调用系统功能增加程序数据的内存空间,然后返回。显然,堆的分配效率很低。
虽然,栈有很多好处,但是和堆相比,不是很灵活,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性,有时候分配大量内存空间,还是用堆比较好。。