簡體   English   中英

c#編譯器比VB.NET編譯器更智能嗎?

[英]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-運行vbccsc

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

所以, 是的 ,至少在這方面, cscvbc “更聰明”。 但我敢打賭,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM