[英]Is the c# compiler smarter than the VB.NET compiler?
如果我查看Linqpad中為以下兩個代碼片段創建的IL,我想知道這里發生了什么。
在c#中
int i = 42;
得到以下IL代碼
IL_0000: ret
而在VB中
Dim i As Integer = 42
它是
IL_0000: ldc.i4.s 2A
IL_0002: stloc.0
顯然,c#編譯器理解該值從未使用過,因此根本不返回任何內容。 在VB.NET中,實際代碼被翻譯。
這是由於編譯器優化的差異還是還有其他工作原因?
更新:只是為了澄清這一點 - 我只是將這一行輸入LinqPad並查看它創建的IL(最明確的是運行相應的編譯器)。 沒有節目。
拿走linqpad問題,我在這些程序中使用/optimize+ /debug-
運行vbc
和csc
:
Module f
Public Sub Main()
Dim i As Integer = 42
End Sub
End Module
和
public static class f
{
public static void Main()
{
int i = 42;
}
}
並從ILDASM獲得這些CIL結果:
對於VB:
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 4 (0x4)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldc.i4.s 42
IL_0002: stloc.0
IL_0003: ret
} // end of method f::Main
對於C#:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method f::Main
所以, 是的 ,至少在這方面, csc
比vbc
“更聰明”。 但我敢打賭,JITter會在執行時刪除任何差異。
編輯
我檢查過,實際上執行的本機代碼是不同的,至少在我的系統上。 我在兩者中調用Console.ReadLine()
來給我一個附加調試器的機會,我得到了這些反匯編:
來自VB:
00000000 sub rsp,38h
00000004 mov dword ptr [rsp+20h],0
0000000c mov rax,7FF000434D8h
00000016 mov eax,dword ptr [rax]
00000018 test eax,eax
0000001a je 0000000000000021
0000001c call FFFFFFFFE45BA230
00000021 mov dword ptr [rsp+20h],2Ah
00000029 call FFFFFFFFE26ABF20
0000002e mov qword ptr [rsp+28h],rax
00000033 nop
00000034 jmp 0000000000000036
00000036 add rsp,38h
0000003a ret
來自C#:
00000000 sub rsp,38h
00000004 mov rax,7FF000534D8h
0000000e mov eax,dword ptr [rax]
00000010 test eax,eax
00000012 je 0000000000000019
00000014 call FFFFFFFFE45AA230
00000019 call FFFFFFFFE391BF20
0000001e mov qword ptr [rsp+20h],rax
00000023 nop
00000024 jmp 0000000000000026
00000026 add rsp,38h
0000002a ret
現在,我的組合幾乎不存在,但即使我可以看到
mov dword ptr [rsp+20h],2Ah
在from-VB中指的是十六進制2A
的常數值,即小數點后42。 所以,你去,它最終會執行更多的指令。
我認為在C#情況下,編譯器執行內存分配部分並在一步中保存int的值,在VB情況下,DIM語句是第一步,它只分配內存,然后將值保存在第二步。 DIM是通用的,並且與所有數據類型一起使用,因此它可能在所有情況下都是額外的一步。 思考?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.