栈区(stack):由编译器自动分配和释放,用于保存局部变量、返回地址、函数的实参以及上下文。操作方法类似于数据结构中的栈;
堆区(heap):一般有用户(即程序员)分配和释放。常用于用户、临时内存分配,用完归还系统。
堆和栈都属于动态存储区,区别于全局变量、常量的静态存储区。下面对堆和栈的区别进行如下说明:
1.管理方式
栈:由编译器管理;
堆:由用户管理;
2.生长方向
栈:向下。即向着低地址扩展;
堆:向上。即向着高地址扩展;
3. 碎片问题
栈:连续的内存区域,不会产生碎片。栈顶地址和栈的最大容量是系统预先规定好的。
堆:不连续的内存区域,容易产生碎片。系统用链表来存储空间内存地址,链表的遍历方向由低地址向高地址遍历,关于此参考操作系统。
4. 空间大小
栈:一般较小,大小固定,一般为1M;
堆:一般比栈大,受限于计算机系统中有效的虚拟内存,32位系统下一般为4G。堆相对于栈,或得空间更灵活;
5. 分配方式
栈:有静态分配和动态分配两种分配方式(区分前面讲的静态存储区和动态存储区)。静态分配由编译器完成;
堆:只有动态分配,如 p1=(int *)malloc(10);
6. 分配效率
栈:系统自动分配,用户无法控制,计算机在底层对栈提供支持,分配专门的寄存器存放栈地址,压栈和出栈都有专门的指令,故速度较快;
堆:速度较慢。库函数按照一定的算法分配空闲空间(参考操作系统)。
推荐阅读: