這是一篇講述函式呼叫原理的文章,通過大量的示意圖從比較基礎的概念開始闡述函式呼叫時堆疊的完整變化過程,同時還會通過一個具體例子來分析在X-64平臺上函式的呼叫過程,從而理解函式呼叫原理。最後會提供幾個例子來發現C語言函式棧幀的一些有意思的行為。
文章提供了gitbook的閱讀方式。
github地址:github.com/acodercat/function-call...
如果對你有幫助,歡迎star!
目錄
本文可以收穫什麼?
- 函式間如何轉移控制
- 函式間如何傳遞資料
- 棧幀的初始化與銷燬
- C/C++陣列越界的危害
- 為什麼內聯(inline)函式效率高
- 為什麼儘量用迴圈來代替遞迴呼叫
- 為什麼靜態變數在函式返回後不會被釋放
- 什麼是棧溢位攻擊
其他
文中有一個重要的概念記憶體對齊
沒有提及,由於它不屬於函式呼叫範疇之內,也就沒有對它進行說明。我在構造示例時也避免了編譯器為了記憶體對齊而出現一些額外指令,所以文中也見不到它的影子。如果你有興趣可以通過網路去了解與它相關的內容。
相關資源
書籍:
《深入理解計算機系統》(第三版)
《組合語言》(王爽第三版)
公開課:
《程式設計正規化》(史丹佛公開課)
繪圖工具
文中所有圖片都使用了excalidraw作為繪圖工具,這是一款非常棒的線上繪圖工具,它提供了不同風格的繪製模式。
本作品採用《CC 協議》,轉載必須註明作者和本文連結