如何强制编译器使用ldc.il8指令代替ldc.I4 + 1

本文关键字:ldc I4 指令 il8 何强制 编译器 | 更新日期: 2023-09-27 18:17:45

这是我的c#代码:

const long pSize = 20;

无论我是否使用x64或任何CPU在发布模式下构建它,我得到下面的MSIL指令:

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

然而,MSIL有ldc。i8指令。如何使编译器使用这个?

如何强制编译器使用ldc.il8指令代替ldc.I4 + 1

MSIL有ldc。i8指令。如何使编译器使用这个?

你不。那将是更糟糕的代码。

ldc.i4.s   20
conv.i8

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

ldc.i8 20

是9个字节:1个用于指令,8个用于常量。

编译器足够聪明,可以避免六个不必要的字节。请记住,将代码加载到内存中所需的页面错误数量会对代码的速度产生不利影响;生成的代码比实际需要的代码大三倍就违背了这个目标。

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

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

不仅仅是六个额外的字节;这六个额外的字节使得其他代码变得更大;你还得考虑那笔费用。

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

如果您下定决心要使用一个生成较差代码的编译器,那么编译器的源代码是可用的。如果您出于某种原因确实需要一个反优化编译器,请随意编写。