1、管理方式:
对于栈来讲,是由编译器自动管理,无需手动控制。对于堆来说,释放工作由开发人员控制,容易memoryleak。
2、申请大小:
栈是向低地址扩展的数据结构,是一块连续的内存区域。(意思是说栈顶的地址和栈的最大容量是系统预先规定好的,如果申请的空间超过栈的剩余空间,就会overflow)。因此能从栈获得的空间较小
堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表类存储的空闲内存地址,自然是不连续的内存区域。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大
3、碎片问题:
堆:频繁的new/delete会造成内存空间的不连续,从而造成大量碎片,是程序效率降低
栈:不会存在此问题,因为栈是先进先出(FIFO)的队列,永远不可能有一个内存块从栈中间弹出
4、分配方式:
分配方式:
堆是动态分配,没有静态分配的堆。
堆区动态分配由编译器进行释放,无需手动实现
栈有两种分配方式:静态、动态分配
栈的静态分配是编译器完成的,比如局部变量的分配。
栈的动态分配由alloc函数分配。
5、申请效率的比较:
栈由系统自动分配,速度快,但开发者无法控制
堆由new分配的内存,速度慢,而且容易产生内存碎片,不过用起来最方便