# 堆和栈的区别
+ 管理方式不同:堆中资源由程序员控制,容易产生内存泄漏,栈资源由编译器自动管理,无需手动控制;
+ 内存管理机制不同:系统有一个记录空闲列表的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆节点,删除空闲节点列表中的该节点,并将该节点空间分配给程序(大多数系统都会在这块内存空间首地址记录本次分配的大小,这样delete时才会释放本内存空间,另外系统会将多余的部分重新放入到空闲列表中);对于栈来说,只要栈的剩余空间大于所申请空间系统就为程序提供内存,否则报异常提示栈溢出。
+ 空间大小不同:堆是不连续的内存区域(因为系统使用链表来存储空间内存地址。自然是不连续的),堆大小受限于计算机系统中有效的虚拟地址(32位系统理论上是4G),所以堆的空间比较灵活,也比较大;栈是一块连续的内存区域,大小是操作系统预定好的,默认大小基本都是 MB级别。可调整。
+ 碎片问题不同:对于堆来说,频繁的调用 new/delete 会造成大量的碎片,使程序效率降低;对于栈它是一块连续的区域,不会产生碎片问题。
+ 生长方向不同:堆向上,向高地址方向增长;栈向下,向低地址方向增长。
+ 分配方式不同:堆都是动态分配;栈由静态分配和动态分配,静态分配由编译器完成(局部变量分配),动态分配由 malloc 函数分配,但栈的动态分配资源由编译器释放,无需程序员实现;
+ 分配效率不同:堆是由 C/C++ 函数库实现,机制复杂,所以堆的效率要比栈低;栈是由系统提供的数据结构,计算机在底层对栈进行支持,分配专门寄存器存放栈地址。栈操作由专门指令;