c# Int32字面值对浮点数的性能损失
本文关键字:性能 损失 浮点数 Int32 字面值 | 更新日期: 2023-09-27 18:10:34
在c#中,您可以将数字字面值定义为int或double
Double var1 = 56.1;
int var2 = 51;
这些是分配给字面值的默认类型。然而,我正在开发的游戏引擎使用浮动来实现位置、旋转等。当浮点数被赋值为双字面值时,即float varFloat = 75.4;
,编译器抛出一个错误,说双字面值需要是浮点数,这是正确的。因此需要将双字面值转换为浮点数。float varFloat = 75.4f;
。然而,当给定int字面值时,int会隐式转换为浮点数。例如,
float varFloat = 44; // This is fine.
我的问题是编译器是否足够聪明,可以意识到44应该是浮点文字?如果不是,这意味着每次访问字面量时,它也会执行转换。在大多数情况下,这并不重要。但是在高性能代码中,如果到处使用整型而不是浮点数,这可能会成为一个问题(即使是一个小问题)。据我所知,没有办法在不遍历源代码的情况下将这些字面值转换为浮点数,这真的不值得花时间。
那么,编译器是否将整型字面量转换为浮点字面量呢?如果不是,除了尽量避免这种处理能力的浪费之外,还能做些什么呢?
答案是肯定的。聪明的人知道这一点。
这是一个具有这样一个赋值的简单程序的反汇编IL(由ILSpy提供)。从地图上可以看到。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
float ="小于"
当您尝试将float转换为double时,可能会失去精度
C:将double转换为float,保留小数点精度 c# 也是如此当你写Float x = 5;编译器会在编译时将其转换为
没有性能问题