代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

.NET乘法优化

  •  7
  • Erik Forbes  · 技术社区  · 16 年前

    编译器是否将任何乘法优化为1?也就是说,考虑:

    int a = 1;
    int b = 5 * a;
    

    表达式5*a是否只优化为5?如果没有,如果a被定义为:

    const int a = 1;
    
    4 回复  |  直到 16 年前
        1
  •  14
  •   Mark Cidade    16 年前

    它将在编译时预先计算任何常量表达式,包括字符串连接。没有 const 它将被单独留下。

    您的第一个示例编译到此IL:

    .maxstack 2
    .locals init ([0] int32, [1] int32)
    
    ldc.i4.1   //load 1
    stloc.0    //store in 1st local variable
    ldc.i4.5   //load 5
    ldloc.0    //load 1st variable
    mul        // 1 * 5
    stloc.1    // store in 2nd local variable 
    

    第二个示例编译如下:

    .maxstack 1
    .locals init ( [0] int32 )
    
    ldc.i4.5 //load 5 
    stloc.0  //store in local variable
    
        2
  •  1
  •   1800 INFORMATION    16 年前

    持续传播是最常见和最简单的优化之一。

        3
  •  1
  •   Dave Tarkowski    16 年前

    查看Mono编译器生成的代码,具有非常量a的版本在运行时执行乘法。也就是说,乘法没有被优化。如果你做了一个常量,那么乘法就被优化了。

    Microsoft编译器可能有更具攻击性的编译器,最好的解决方案是查看编译器生成的代码,看看它在做什么。

        4
  •  0
  •   Mike F    16 年前

    编译器在这里优化的不是每本身乘以1,而是在编译时已知值的算术。所以是的,编译器可以优化示例中的所有数学,不管有没有 const .

    编辑: 有能力的 我应该说,编译器。