堆和栈有什么区别?
- 分配和管理方式不同:
- 堆是动态分配的,其空间的分配和释放都由程序员控制;
- 栈是由编译器自动管理的,其分配方式有两种:静态分配由编译器完成,比如局部变量的分配;动态分配由
alloca()
函数进行分配,但是会由编译器释放;
- 产生碎片不同:
- 对堆来说,频繁使用
new/delete
或者malloc/free
会造成内存空间的不连续,产生大量碎片,是程序效率降低; - 对栈来说,不存在碎片问题,因为栈具有先进后出的特性;
- 对堆来说,频繁使用
- 生长方向不同:
- 堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长;
- 栈是向着内存地址减小的方向增长的,从内存的高地址向低地址方向增长;
- 申请大小限制不同:
- 栈顶和栈底是预设好的,大小固定;
- 堆是不连续的内存区域,其大小可以灵活调整