如何强制编译器使用 ldc.i8 IL 指令而不是 ldc.i4 加 conv.i8?

How to force compiler to use ldc.i8 IL instruction instead of ldc.i4 plus conv.i8?

这是我的 C# 代码:

const long pSize = 20;

无论我使用 x64 还是 Any CPU 在 Release 模式下构建它,我都得到以下 MSIL 指令:

  IL_0010:  ldc.i4.s   20
  IL_0012:  conv.i8

但是,MSIL 有 ldc.i8 指令。如何让编译器使用它?

MSIL has ldc.i8 instruction. How to make compiler to use this?

你不知道。那会是更糟糕的代码。

ldc.i4.s   20
conv.i8

是三个字节的代码:两个用于指令,一个用于常量。而

ldc.i8 20

是九个字节:一个用于指令,八个用于常量。

编译器足够聪明,可以避免六个不必要的字节。请记住,代码的速度可能会受到将其加载到内存中所需的页面错误数量的不利影响;生成的代码 比需要的代码大三倍 与该目标背道而驰。

但是等等,还有更多,而且都很糟糕。

基本代码块越大,它周围的分支越有可能比紧凑分支指令格式中的要长。这意味着这种去优化可以使分支指令变大,进而使它们的基本块变大,现在可能围绕它们的分支不是紧凑,整个事情可以滚雪球。

不仅仅是六个额外的字节;这就是这六个额外字节使 other 代码变大的结果;你也必须考虑这笔费用。

编译器做得很好。让它发挥作用。

如果您想要一个生成更差代码的编译器,可以使用编译器的源代码。如果出于某种原因确实需要一个反优化编译器,请随意编写一个。