這是一篇講述函數(shù)調(diào)用原理的文章手幢,通過大量的示意圖從比較基礎(chǔ)的概念開始闡述函數(shù)調(diào)用時堆棧的完整變化過程,同時還會通過具體例子來分析在X-64平臺上函數(shù)調(diào)用在匯編級的表示旬牲,從而深刻理解函數(shù)調(diào)用原理胰默。最后會提供幾個例子來發(fā)現(xiàn)C語言函數(shù)棧幀的一些有意思的行為。
全文將帶領(lǐng)你領(lǐng)略函數(shù)與棧的魅力唱遭,文章提供了gitbook的閱讀方式。
如果你覺得對你有幫助,可以來到文章的github倉庫點個star爸嫉 !
目錄
- 前置知識
- 內(nèi)存中的棧
- 控制轉(zhuǎn)移
- 數(shù)據(jù)傳遞
- 寄存器的保存與恢復(fù)
- 局部變量的存儲
- 函數(shù)棧幀
- C語言函數(shù)棧幀實例
- 一個有趣的例子
- 手動修改棧幀數(shù)據(jù)
- 總結(jié)
本文可以收獲什么蜈块?
- 函數(shù)間如何轉(zhuǎn)移控制
- 函數(shù)間如何傳遞數(shù)據(jù)
- 棧幀的初始化與銷毀
- C/C++數(shù)組越界的危害
- 為什么內(nèi)聯(lián)(inline)函數(shù)效率高
- 為什么盡量用循環(huán)來代替遞歸調(diào)用
- 為什么靜態(tài)變量在函數(shù)返回后不會被釋放
- 什么是棧溢出攻擊
其他
文中有一個重要的概念內(nèi)存對齊
沒有提及鉴腻,它不屬于函數(shù)調(diào)用范疇之內(nèi)。我在構(gòu)造示例時避免了編譯器為了內(nèi)存對齊
而生成一些額外的指令百揭,所以文中見不到它的影子爽哎。如果你有興趣可以通過網(wǎng)絡(luò)去了解與它相關(guān)的內(nèi)容。
相關(guān)資源
-
書籍:
- 《深入理解計算機(jī)系統(tǒng)》(第三版)
- 《匯編語言》(王爽第三版)
-
公開課:
- 《編程范式》(斯坦福公開課)
繪圖工具
文中所有圖片都使用了excalidraw作為繪圖工具器一,這是一款非常棒的在線繪圖工具课锌,它提供了不同風(fēng)格的繪制模式。