父函数进入子函数前后发生到底发生了什么
引用
https://www.cnblogs.com/bangerlee/archive/2012/05/22/2508772.html
- 基础:
理解以下总结性概念之前,请阅读下上面引用的帖子
每个进程都有一个对应于用户态的栈区,栈区内部根据函数划分栈帧,栈底xbp(32位x=e,64位x=r),从上往下增长的栈区,栈顶位xsp,在函数进入和退出的之间 xbp和xsp之间,是属于函数的栈帧区域 - 进入子函数,C/c++语言函数参数压栈顺序从右到左
原因:
进入子函数,父函数中的局部变量原来是存储在堆区的,那么需要压入栈区
子函数退出后,再恢复现场,所以将局部变量的地址传入子函数,子函数操作的指针
已经不是原来的局部变量所在地方了但是退出的时候,恢复现场后,地址还是对应的,这个回复现场后是否对应地址我觉得跟堆区地址是否被占用有关系,默认情况下,只要堆区资源还在,应该是恢复到原来地址局部变量的地址都存储在栈帧区域中
子函数退出后,那么属于子函数的局部变量被释放,是因为子函数结束后,整个栈帧都被释放了,所以局部变量自然也就没有生命了
return的本质就是把父函数的内存地址的下一条指令给ip寄存器
变量存储本质
- 全局变量和静态变量存储在内存静态区