2

次のことを考えると、C# コンパイラはどれだけ賢いか:

float a = 1; //A
var b = 1f; //B
var c = (float)1; //C - Is this line equivalent to A and B?
var d = Convert.ToSingle(1); //D - Is this line equivalent to A and B?

私の知る限り、コンパイル後は A と B は同等です。他のラインはどうですか?

C と D は、コンパイル時に A と B と同等になるように最適化されますか? それとも、実行時にのみ割り当てられ、割り当てを実行するためにより多くの処理が必要になりますか?

キャスト (C) は最適化する必要があり、関数 (D) は最適化してはいけないと思います。

いずれにせよ、VS2012 を使用して生成されたアセンブリ コードを調査および比較するにはどうすればよいでしょうか。

4

2 に答える 2

4

最初の 3 行は同等です。実際、それらは同じ IL にコンパイルされます (少なくとも、私が使用した .NET 4 コンパイラでは)。

4 つ目は、メソッドを呼び出すことによって実行されるランタイム変換であり、これはまったく別の獣です。

生成されたILの検査については、ILコード検査を簡単にするツールをご覧ください。

于 2013-05-16T16:30:08.923 に答える
1

VS2012 を使用して、生成されたアセンブリ コードを調査および比較するにはどうすればよいですか?

「アセンブリに移動」 (またはCTRL+ ALT+を押しDます)

答えは以下のとおりです....

            float x = 1; //A
00000061  fld1 
00000063  fstp        dword ptr [ebp-40h] 
            var x1 = 1f; //B
00000066  fld1 
00000068  fstp        dword ptr [ebp-44h] 
            var x2 = (float)1; //C - Is this line equivalent to A and B?
0000006b  fld1 
0000006d  fstp        dword ptr [ebp-48h] 
            var x3= Convert.ToSingle(1); //D - Is this line equivalent to A and B?
00000070  mov         ecx,1 
00000075  call        5FB7A2DC 
0000007a  fstp        dword ptr [ebp-50h] 
0000007d  fld         dword ptr [ebp-50h] 
00000080  fstp        dword ptr [ebp-4Ch] 
于 2013-05-16T16:33:39.490 に答える