值类型可能存储在线程的堆栈中,IL 在执行堆栈中运行(抽象概念)。
int y=0;
int a=0;
int b=0;
int x = y + (a - b);
IL_0001: ldc.i4.0
IL_0002: stloc.0 // y
IL_0003: ldc.i4.0
IL_0004: stloc.1 // a
IL_0005: ldc.i4.0
IL_0006: stloc.2 // b
IL_0007: ldloc.0 // y
IL_0008: ldloc.1 // a
IL_0009: ldloc.2 // b
IL_000A: sub
IL_000B: add
IL_000C: stloc.3 // x
现在stloc.0
从执行堆栈中弹出值并存储到局部变量列表中。因此,局部变量列表必须存储在与执行堆栈不同的空间中。什么是局部变量列表?它是一个线程的堆栈吗?
.maxstack = 3
另外,方法指的是哪个堆栈?是局部变量列表的大小吗?还是推入执行堆栈的附加存储的最大大小?
在我看来,执行堆栈是正确的堆栈,因为它只支持push
和pop
. 局部变量列表支持load
从一个索引store
到一个索引。这与堆栈有什么关系?
更新:
ECMA 335 I.12.3 机器状态清楚地回答了我的问题。