堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有如下几种区别
- 管理方式不同,栈是系统自动分配,堆要让程序员分配,不过容易造成内存泄漏
- 空间大小不同,栈大小要远远小于堆大小,栈的大小 64bits 的 Windows 默认 1MB,堆默认10Mb
- 生长方向不同,堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
- 分配效率不同,堆的效率比栈要低得多。
- 存放内容不同,栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另 外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的 地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容 (EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变 量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一 条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中 具体存放内容是由程序员来填充的