• 方法调用时栈内存的分配
    • 对 stack frame 的分析

stack frame:一个方法被调用时,它在栈内存中的布局。

C# 中调用方法时的变量归 Caller(主调函数) 管,不归 Callee(被调用者) 管。
压变量入栈,C# 是从左至右的顺序。

图示是为了重点解释方法、变量、参数的压栈,实际情况下还要压入返回地址等。
返回值一般存在 CPU 的寄存器里面,特殊情况寄存器存不下该返回值时,会到栈上开辟空间。

stack overflow 就是栈无限向上延伸(分配变量、参数、栈针等),最后溢出了。

代码

  1. using System;
  2. namespace CSharpMethodExample
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. double result = Calculator.GetConeVolume(100, 90);
  9. }
  10. }
  11. class Calculator
  12. {
  13. public static double GetCircleArea(double r)
  14. {
  15. return Math.PI * r * r;
  16. }
  17. public static double GetCylinderVolume(double r,double h)
  18. {
  19. double a = GetCircleArea(r);
  20. return a * h;
  21. }
  22. public static double GetConeVolume(double r,double h)
  23. {
  24. double cv = GetCylinderVolume(r, h);
  25. return cv / 3;
  26. }
  27. }
  28. }

分步讲解