限于作者能力水平,本文可能存在谬误,对此给读者带来的损失,作者不错任何承诺。
如果对函数B的调用是函数A执行的最后一条语句,这就是尾调用(Tail Call)。详见 https://eklitzke.org/how-tail-call-optimization-works 或 https://www.ruanyifeng.com/blog/2015/04/tail-call.html 。
调用函数时会为其在堆栈上维护一个栈帧,记录局部变量和返回地址等信息,如果函数A对B的调用是函数A执行的最后一条语句,则表明函数A栈帧信息不会再被用到,这时可以将A的栈帧空间给函数B使用,而不是为B函数重新开辟栈帧空间,这就是尾递归优化(Tail Call Optimization)。详见 https://eklitzke.org/how-tail-call-optimization-works 或 https://www.ruanyifeng.com/blog/2015/04/tail-call.html 。
改变内核代码,通过脚本 scripts/bloat-o-meter 比较前后两次编译出的 vmlinux 文件中符号的增减变化:
./scripts/bloat-o-meter vmlinux.old vmlinux
https://eklitzke.org/how-tail-call-optimization-works
https://www.ruanyifeng.com/blog/2015/04/tail-call.html
https://www.cnblogs.com/arnoldlu/p/10442099.html