- 方法调用时栈内存的分配
- 对 stack frame 的分析
stack frame:一个方法被调用时,它在栈内存中的布局。
C# 中调用方法时的变量归 Caller(主调函数) 管,不归 Callee(被调用者) 管。
压变量入栈,C# 是从左至右的顺序。
图示是为了重点解释方法、变量、参数的压栈,实际情况下还要压入返回地址等。
返回值一般存在 CPU 的寄存器里面,特殊情况寄存器存不下该返回值时,会到栈上开辟空间。
stack overflow 就是栈无限向上延伸(分配变量、参数、栈针等),最后溢出了。
代码
using System;
namespace CSharpMethodExample
{
class Program
{
static void Main(string[] args)
{
double result = Calculator.GetConeVolume(100, 90);
}
}
class Calculator
{
public static double GetCircleArea(double r)
{
return Math.PI * r * r;
}
public static double GetCylinderVolume(double r,double h)
{
double a = GetCircleArea(r);
return a * h;
}
public static double GetConeVolume(double r,double h)
{
double cv = GetCylinderVolume(r, h);
return cv / 3;
}
}
}