.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
的操作数类型,您的代码将无法验证并可能导致垃圾本机代码。
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
的操作数类型,您的代码将无法验证并可能导致垃圾本机代码。