1、堆
就是一个空闲的内存,在此实现内存的分配和释放,由我们分配和释放
2、栈
是由操作系统自动分配内存,用来存放函数的参数值、局部变量等
3、两者的区别:
(1) 管理方式不同:栈是由操作系统自动分配释放,堆是由开发者来实现内存的分配和释放。
(2) 生长方式不同:栈是从高向低生长,也就是说向下生长,内存地址由高到低;堆是从低向高生长,也就是说向上生长,内存地址由低到高。
(3) 空间大小不同:栈 一般是 1M ~10M 不等(和堆相差很多);
堆 进程可申请的堆大小为虚拟内存大小;
一般来说,栈的空间大小远远小于堆的空间大小。
(4) 分配方式不同:栈可静态分配或动态分配;堆都是动态分配的。
(5) 存放的内容不同:栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。栈在函数调用时,首先压入主调函数中下条指令(函数调用语句的下条可执行语句)的地址,然后是函数实参,然后是被调函数的局部变量。本次调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的指令地址,程序由该点继续运行下条可执行语句。
堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来安排的
(6) 内存速率不同:栈的内存速率较快。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,这就决定了栈的效率比较高。堆因为是程序员分配内存 ,而且是由C/C++函数库提供的,机制比较复杂,所以速率较慢。