C#Int32文本到浮点的性能损失

C#Int32文本到浮点的性能损失,c#,.net,performance,compiler-construction,C#,.net,Performance,Compiler Construction,在c#中,可以将数字文字定义为int或double Double var1 = 56.1; int var2 = 51; 这些是分配文字的默认类型。然而,我正在开发的游戏引擎使用浮点数进行位置、旋转等操作。当浮点数被指定为双精度时,即,float varFloat=75.4编译器抛出一个错误,指出双精度文本必须是浮点,这是正确的。因此需要将双字面值转换为浮点值,即float varFloat=75.4f。但是,当给定int文本时,int被隐式转换为float。即 flo

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

    Double var1 = 56.1;
    int var2 = 51;
这些是分配文字的默认类型。然而,我正在开发的游戏引擎使用浮点数进行位置、旋转等操作。当浮点数被指定为双精度时,即,
float varFloat=75.4编译器抛出一个错误,指出双精度文本必须是浮点,这是正确的。因此需要将双字面值转换为浮点值,即
float varFloat=75.4f。但是,当给定int文本时,int被隐式转换为float。即

    float varFloat = 44; // This is fine.
我的问题是,编译器是否足够聪明,能够意识到44应该是浮点文本?如果不是,这意味着每次访问文本时,它也在执行转换。在大多数情况下,这并不重要。但是对于高性能代码,如果到处都使用int而不是float,那么它可能会成为一个问题(即使它是一个小问题)。据我所知,如果不经过一行行行的源代码,就无法将这些文本更改为浮点数,而这些代码实际上根本就没有花多少时间


那么,编译器是否将int文本转换为float文本?如果没有,那么除了努力避免这种处理能力的浪费,还能做些什么呢?

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

这是一个具有这样一个赋值的简单程序的反汇编IL(由提供)。如您所见,没有发生转换:

.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
float比double“小”

当您尝试将float转换为double时,可能会丢失精度

见此:

C也是如此#

当你写作时 浮动x=5; 编译器将在编译时将其转换为 浮动x=5.0


没有性能问题

。也许是“方便”。那么“标准足够智能”呢“处理能力的浪费”是一个非常大胆的说法,它涉及到像文字这样的语言结构。值得你花时间通读C#以了解C#的实际工作原理。+1是一个合理的解释,解释了为什么它转换为5.0而不是5.1。它将保持量级,但不一定精确。这不是将双精度转换为浮点数的问题,但是,如果将整数文本分配给浮点值会对性能产生影响。不过,这对其他人来说还是有用的信息。