堆和栈的区别
1. 分配方式
栈:由系统分配。例如:局部变量 int b ,系统自动为变量b开辟空间。
堆:需要程序员主动开辟空间,并指定大小。例如:p = (char *)malloc(1024),开辟的1024字节空间存放在堆中,注意变量p还是在栈中。
2. 申请后的响应
栈:只要所申请的空间小于剩余的空间,系统将提供内存空间,否则栈溢出。
堆:当收到内存申请时,系统会遍历一个记录空闲空间的链表,把遍历到的第一个大于申请空间的堆节点分配给程序,最后把该节点从链表中删除。
当然,分配的空间大小不一定等于所申请的空间大小,剩余的空间重新放入空闲链表中。
3. 分配空间的限制
栈:地址连续。由高地址向低地址分配,由此可见,栈顶地址和栈的大小已经编译时固定好。
堆:地址不连续。由低地址向高地址扩展,因为链表是从低地址向高地址遍历,大小与有效的虚拟内存相关。
4. 效率
栈:分配速度快,效率高。
堆:分配速度慢,效率相对低,容易产生碎片。
5. 总结
栈:速度快,自由度小,方便。
堆:速度相对慢,自由度高,相对麻烦。