相关疑难解决方法(0)

CLR中实际分配的局部变量在哪里?

我只是进入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编译器.我们实际上可以将我们的程序使用的内存分成评估堆栈,托管堆和本地分配的内存.

这是真的?或者还有其他一些机制?

.net c# clr cil memory-management

4
推荐指数
2
解决办法
557
查看次数

标签 统计

.net ×1

c# ×1

cil ×1

clr ×1

memory-management ×1