堆栈是个特殊的存储区,属于RAM空间的一部分 | |||||||||||||||||
堆栈用于函数调用、中断切换时保护和恢复现场数据 | |||||||||||||||||
堆栈中的物体具有一个特征:第一个放入堆栈中的总是最后被拿出来 | |||||||||||||||||
堆栈中定义了一些操作,两个重要的是PUSH和POP | |||||||||||||||||
PUSH入栈:堆栈指针SP加1,然后在堆栈的顶部加入一个元素 | |||||||||||||||||
POP出栈:先将SP所指示的内部RAM单元中内容送入直接地址寻址的单元中 | |||||||||||||||||
然后再将堆栈指针SP减1 | |||||||||||||||||
这两种操作实现了数据项的插入和删除 | |||||||||||||||||
堆栈空间分配 | |||||||||||||||||
堆:由操作系统自动分配释放,存放函数的参数,局部变量等 | |||||||||||||||||
堆:由程序员分配释放,若程序员不释放,程序结束时可能由操作 | |||||||||||||||||
申请响应: | |||||||||||||||||
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出 | |||||||||||||||||
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当程序收到程序的申请时 | |||||||||||||||||
会遍历该链表,寻找第一个空间大于所申请空间的堆节点 | |||||||||||||||||
然后将该节点从空闲节点链表删除,并将该节点的空间分配给程序 | |||||||||||||||||
会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的deliete语句才能正确的释放内存空间 | |||||||||||||||||
另外,由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表中 | |||||||||||||||||
存储内容: | |||||||||||||||||
栈:在函数调用时,参数时从右往左入栈的,然后是函数中的局部变量 | |||||||||||||||||
静态变量是不入栈的 | |||||||||||||||||
本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向函数的返回地址,也就是主函数下一条指令的地址,程序由该点继续运行 | |||||||||||||||||
堆:一般是在堆的头部用一个字节存放堆的大小 | |||||||||||||||||
|
|||||||||||||||||
程序运行堆栈
猜你喜欢
转载自blog.csdn.net/weixin_38756546/article/details/87986190
今日推荐
周排行