我想弄清楚如何在 C# 中存储数据。例如,当 IL 运算符 Stloc 获取堆栈的顶部值并将其放入局部变量时,这个变量本身存储在哪里?例如,
static void Main()
{
{
int x = 5;
}
}
在 Il-notation 中,这是
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] int32 num)
L_0000: nop
L_0001: nop
L_0002: ldc.i4.5
L_0003: stloc.0 <---В какую область памяти упадет значение из стека?
L_0004: nop
L_0005: ret
}
在 Microsoft CLR 中,局部变量通常*存储在堆栈中,位于分配给当前函数的帧中。栈是当前JIT编译器的一个实现细节,在IL代码层面是不存在的(原则上在其他CLR实现中也可能不存在)。
IL 代码是一个堆栈机器,其堆栈只是 Microsoft CLR 的描述性构造,并在 JIT 编译期间转换为“常规”寄存器代码。IL栈与JIT编译器工作的栈无关,只是一个形式上的组件。
*例外情况: