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文字?如果没有,除了试图避免它之外,还可以做些什么呢?
答案是肯定的.知道这一点很聪明.
这是一个反汇编的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)