C#对Int32文字到浮点数的性能损失

Chr*_*ond 3 .net c# compiler-construction performance

在c#中,您可以将数字文字定义为int或double

    Double var1 = 56.1;
    int var2 = 51;
Run Code Online (Sandbox Code Playgroud)

这些是文字分配的默认类型.但是,我正在使用的游戏引擎使用浮点数进行位置,旋转等.当浮点数被赋值为文字双精度数时,即float varFloat = 75.4;编译器抛出一个错误,说双重文字需要是浮点数,这是正确的.因此,需要将双文字转换为浮动,即.float varFloat = 75.4f;.但是,当给定int文字时,int会隐式转换为float.也就是说,

    float varFloat = 44; // This is fine.
Run Code Online (Sandbox Code Playgroud)

我的问题是编译器是否足够聪明才能意识到44应该是float字面值?如果不是,这意味着每次访问文字时,它也会执行转换.在大多数情况下,这无关紧要.但是对于高性能代码,如果整个地方使用整数而不是浮点数,它可能会成为一个问题(即使它是一个小问题).据我所知,没有办法将这些文字更改为浮点数而不经过源代码行,而这些源代码实际上根本没有花费时间.

那么,编译器是否将int文字转换为float文字?如果没有,除了试图避免它之外,还可以做些什么呢?

Dav*_*kle 8

答案是肯定的.知道这一点很聪明.

这是一个反汇编的IL(由ILSpy提供)一个简单的程序,它具有这样的任务.从ldc.r4指令可以看出,没有发生转换:

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 8 (0x8)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] float32 x
    )

    IL_0000: nop
    IL_0001: ldc.r4 44
    IL_0006: stloc.0
    IL_0007: ret
} // end of method Program::Main
Run Code Online (Sandbox Code Playgroud)

  • "标准足够聪明"怎么样?:) (4认同)