堆和栈的区别
从管理方式上,
栈是由编译器自动管理,无需我们手动控制;
对于堆,开辟和释放工作由程序员控制,所以有内存泄漏等情况的发生。
从申请大小上,
栈是有高地址向低地址扩展的,是一块连续的内存区域,所以栈的栈顶地址或者大小 是一开始就分配好的。在使用过程中,比如递归调用层数过多,那么就有可能造成栈溢出,所以栈能获得的空间比较少;
堆是向高地址扩展的,是链表组织的方式,所以有可能是不连续的,他的大小只受限于有效的虚拟内存大小,所以堆能开辟的空间较大。
从碎片问题上,
栈是没有碎片的情况,因为他有严格的出栈入栈,不会存在一个内存块从栈的中间位置弹出;
堆有碎片的情况,频繁的调用new/delete分配释放内存,必然会造成内存碎片。
从分配方式上,
堆都是动态分配的
栈大多是静态分配的,也可以动态分配,可以由alloc函数分配。
从分配效率上,
计算机会在底层对栈提供支持,比如有专门的寄存器分配,用来存放栈的地址,压栈出栈的指令等;