gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:54:57 25 4
gpt4 key购买 nike

这是我的 C# 代码:

const long pSize = 20;

无论我使用 x64 还是任何 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

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

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

但是等等,还有更多,而且都不好。

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

不仅仅是六个额外的字节;这就是这六个额外字节使其他代码变得更大的结果;您还必须考虑该费用。

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

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

关于c# - 如何强制编译器使用 ldc.i8 IL 指令而不是 ldc.i4 加 conv.i8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com