- 数据结构
- 程序一般放在Rom(只读内存)中,运行时拷贝到内存RAM(随机存储器)
- 栈区:相对较高的地址,栈地址向下增长
- 堆区:向上增加,给程序员分配的内存空间
- 申请方式和回收方式
- 栈:系统自动分配空间,函数运行的过程中,之后会被释放掉。
- 堆:程序员自己申请的空间,malloc。堆上的空间只要程序员不释放,就一直可以访问到。但是忘记释放,就会造成内存泄漏。
- 申请后系统响应
- 栈:栈的剩余空间不足,报异常栈溢出
- 堆:操作系统有记录空闲内存地址的链表,会找第一个空间大于申请空间的堆节点,然后把该节点删除,空间分给程序,代码的delete会释放空间。没有用掉的系统的空间会继续重新放入空闲链表。
- 申请效率
- 栈:比较快,系统分配
- 堆:new出来的,容易产生内存碎片
- 申请大小的限制
- 栈:windows系统栈是向低地址扩展,连续的内存区域,栈顶的地址和最大容量系统预先设置好了。windows下,栈的大小是2M(编译的时候可以设置);申请的空间超过栈的剩余空间,提示overflow。
- 堆:向高地址扩展,不连续的内存区域(指针实现),链表遍历是从低地址到高地址。堆的大小受限于计算机系统中有效的虚拟内存。
- 存储的内容
- 栈:主函数中函数调用后的下一条指令的地址,然后是函数的各个参数。大部分C编译器,参数从右到左边,函数中的局部变量入栈,静态变量不入栈~
- 堆:头部用一个字节放堆的大小
- 存取效率
char s1[] = "aa";
char *s2 = "bb";
- s1是运行时赋值(栈上的数组比指针指向的字符串存取快)
- s2是编译时确定,堆