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