我只是进入CLR和IL,我对此感到困惑.
我有以下C#代码:
int x = 1;
object obj = x;
int y = (int)obj;
Run Code Online (Sandbox Code Playgroud)
IL为此进行了拆解
// Code size 18 (0x12)
.maxstack 1
.locals init ([0] int32 x,
[1] object obj,
[2] int32 y)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: box [mscorlib]System.Int32
IL_0009: stloc.1
IL_000a: ldloc.1
IL_000b: unbox.any [mscorlib]System.Int32
IL_0010: stloc.2
IL_0011: ret
Run Code Online (Sandbox Code Playgroud)
因此,ldloc.0
指令"将索引0处的局部变量加载到堆栈上".但是当地人真正存储在哪里以及他们从何处装载.因为我认为有两个地方可以分配内存:线程堆栈和堆.变量应存储在堆栈中.
现在,我想,堆栈只是一个"评估堆栈",而变量的内存分配是一个实现细节,依赖于平台和JIT编译器.我们实际上可以将我们的程序使用的内存分成评估堆栈,托管堆和本地分配的内存.
这是真的?或者还有其他一些机制?