1.申请方式:栈是由系统自动分配,堆是由程序员自己开辟,并指明大小
2.申请后的响应:只要剩余的栈空间大于申请的大小,系统就会自动开辟,否则报错提示栈溢出。
操作系统会为空闲的堆内存维护一个链表,开辟的时候回遍历一次这个链表如果找到一个节点指向合适的内存大小,就会将这个节点删除并分配给程 序,另外会在这次分配内存的首地址处标记分配内存的大小,这样在delete的时候就会正确的释放内存。另外,找到的堆节点的内存大小一般都不等于我们申请的内存的大小,系统会将多余的那部分返还给操作系统
3.申请的大小限制:
栈是向下生长的,是连续的内存区域,在Windows下默认为1M大小,但是在VS下可以修改,项目-》属性-》链接-》系统-》堆栈保留大小,如果申请大小超过这个值就会报错栈溢出
堆是向上生长的,内存区域并不连续,这是由于系统是用链表来存储空闲内存地址,因此并不连续。链表遍历的方向的由低地址到高地址,申请的大小
受系统有效的虚拟内存,因此堆内存的申请比较灵活
4.申请效率的比较:
栈是由操作系统分配的,效率高,程序员无法干涉;
堆是malloc分配的内存,比较慢而且容易产生内存碎片
5.存储的内容:
函数调用时最先入栈的是主函数中函数调用语句的下一条可执行语句的地址,然后是参数从右往左入栈,然后是局部变量,静态变量并不入栈。出栈的时候是局部变量最先出栈,然是参数,最后栈顶指针指向主函数的下一条可执行命令的地址,从那开始执行
一般在堆的头部用一个字节表示堆的大小,堆的内容任意写入