5个方面看栈区和堆区的区别

1、管理方式:

            对于栈来讲,是由编译器自动管理,无需手动控制。对于堆来说,释放工作由开发人员控制,容易memoryleak。

2、申请大小:

栈是向低地址扩展的数据结构,是一块连续的内存区域。(意思是说栈顶的地址和栈的最大容量是系统预先规定好的,如果申请的空间超过栈的剩余空间,就会overflow)。因此能从栈获得的空间较小

堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表类存储的空闲内存地址,自然是不连续的内存区域。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大

3、碎片问题:

堆:频繁的new/delete会造成内存空间的不连续,从而造成大量碎片,是程序效率降低

栈:不会存在此问题,因为栈是先进先出(FIFO)的队列,永远不可能有一个内存块从栈中间弹出

4、分配方式:

分配方式:

堆是动态分配,没有静态分配的堆。

堆区动态分配由编译器进行释放,无需手动实现

栈有两种分配方式:静态、动态分配

栈的静态分配是编译器完成的,比如局部变量的分配。

栈的动态分配由alloc函数分配。

5、申请效率的比较:

栈由系统自动分配,速度快,但开发者无法控制

堆由new分配的内存,速度慢,而且容易产生内存碎片,不过用起来最方便

你可能感兴趣的:(5个方面看栈区和堆区的区别)