这是一篇讲述函数调用原理的文章,通过大量的示意图从比较基础的概念开始阐述函数调用时堆栈的完整变化过程,同时还会通过具体例子来分析在X-64平台上函数调用在汇编级的表示,从而深刻理解函数调用原理。最后会提供几个例子来发现C语言函数栈帧的一些有意思的行为。
全文将带领你领略函数与栈的魅力,文章提供了gitbook的阅读方式。
- 函数间如何转移控制
- 函数间如何传递数据
- 栈帧的初始化与销毁
- C/C++数组越界的危害
- 为什么内联(inline)函数效率高
- 为什么尽量用循环来代替递归调用
- 为什么静态变量在函数返回后不会被释放
- 什么是栈溢出攻击
文中有一个重要的概念内存对齐
没有提及,它不属于函数调用范畴之内。我在构造示例时避免了编译器为了内存对齐
而生成一些额外的指令,所以文中见不到它的影子。如果你有兴趣可以通过网络去了解与它相关的内容。
-
书籍:
- 《深入理解计算机系统》(第三版)
- 《汇编语言》(王爽第三版)
-
公开课:
- 《编程范式》(斯坦福公开课)
文中所有图片都使用了excalidraw作为绘图工具,这是一款非常棒的在线绘图工具,它提供了不同风格的绘制模式。