父函數(shù)進(jìn)入子函數(shù)前后發(fā)生到底發(fā)生了什么
引用
https://www.cnblogs.com/bangerlee/archive/2012/05/22/2508772.html
- 基礎(chǔ):
理解以下總結(jié)性概念之前,請閱讀下上面引用的帖子
每個(gè)進(jìn)程都有一個(gè)對應(yīng)于用戶態(tài)的棧區(qū),棧區(qū)內(nèi)部根據(jù)函數(shù)劃分棧幀,棧底xbp(32位x=e,64位x=r),從上往下增長的棧區(qū),棧頂位xsp,在函數(shù)進(jìn)入和退出的之間 xbp和xsp之間,是屬于函數(shù)的棧幀區(qū)域 - 進(jìn)入子函數(shù),C/c++語言函數(shù)參數(shù)壓棧順序從右到左
原因:
進(jìn)入子函數(shù),父函數(shù)中的局部變量原來是存儲在堆區(qū)的,那么需要壓入棧區(qū)
子函數(shù)退出后,再恢復(fù)現(xiàn)場,所以將局部變量的地址傳入子函數(shù),子函數(shù)操作的指針
已經(jīng)不是原來的局部變量所在地方了但是退出的時(shí)候,恢復(fù)現(xiàn)場后,地址還是對應(yīng)的,這個(gè)回復(fù)現(xiàn)場后是否對應(yīng)地址我覺得跟堆區(qū)地址是否被占用有關(guān)系,默認(rèn)情況下,只要堆區(qū)資源還在,應(yīng)該是恢復(fù)到原來地址局部變量的地址都存儲在棧幀區(qū)域中
子函數(shù)退出后,那么屬于子函數(shù)的局部變量被釋放,是因?yàn)樽雍瘮?shù)結(jié)束后,整個(gè)棧幀都被釋放了,所以局部變量自然也就沒有生命了
return的本質(zhì)就是把父函數(shù)的內(nèi)存地址的下一條指令給ip寄存器
變量存儲本質(zhì)
- 全局變量和靜態(tài)變量存儲在內(nèi)存靜態(tài)區(qū)