堆和栈

堆和栈的区别

1. 分配方式

栈:由系统分配。例如:局部变量 int b ,系统自动为变量b开辟空间。

堆:需要程序员主动开辟空间,并指定大小。例如:p = (char *)malloc(1024),开辟的1024字节空间存放在堆中,注意变量p还是在栈中。

 

2. 申请后的响应

栈:只要所申请的空间小于剩余的空间,系统将提供内存空间,否则栈溢出。

堆:当收到内存申请时,系统会遍历一个记录空闲空间的链表,把遍历到的第一个大于申请空间的堆节点分配给程序,最后把该节点从链表中删除。

  当然,分配的空间大小不一定等于所申请的空间大小,剩余的空间重新放入空闲链表中。

 

3. 分配空间的限制

栈:地址连续。由高地址向低地址分配,由此可见,栈顶地址和栈的大小已经编译时固定好。

堆:地址不连续。由低地址向高地址扩展,因为链表是从低地址向高地址遍历,大小与有效的虚拟内存相关。

 

4. 效率

栈:分配速度快,效率高。

堆:分配速度慢,效率相对低,容易产生碎片。

 

5. 总结

栈:速度快,自由度小,方便。

堆:速度相对慢,自由度高,相对麻烦。

posted @ 2014-11-19 10:26  Achille·Swn  阅读(133)  评论(0编辑  收藏  举报