.NET JIT如何判断数字相加

How does .NET JIT determine how to add numbers

CIL 有单一的操作码用于添加数字而不进行溢出检查 - add.

此 C# 代码:

int a = 10;
int b = 20;
int c = a + b;

生成以下 IL 代码:

IL_0000:  ldc.i4.s   10
IL_0002:  stloc.0
IL_0003:  ldc.i4.s   20
IL_0005:  stloc.1
IL_0006:  ldloc.0
IL_0007:  ldloc.1
IL_0008:  add
IL_0009:  stloc.2

JIT 在 运行 时如何确定它应该使用哪种类型的 x86 添加(FPU 操作码 faddp 用于浮点数或 add 表示整数)?

CLR 跟踪计算堆栈上值的类型,因此它知道就在 add 指令之前,堆栈上两个最顶层值的类型在您的代码中是 int32 .这意味着它知道它必须发出添加 32 位整数的指令。

如果您编写的代码中 CLR 无法确定 add 的操作数类型,您的代码将无法验证并可能导致垃圾本机代码。