gpt4 book ai didi

c# - c# 编译器比 VB.NET 编译器更聪明吗?

转载 作者:可可西里 更新时间:2023-11-01 08:44:27 24 4
gpt4 key购买 nike

如果我查看在 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 会消除执行时的任何差异。

编辑

我检查了一下,实际上执行的 native 代码不同的,至少在我的系统上是这样。我在两者中都加入了 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

现在,我的 assembley 几乎不存在,但即使我也能看到

mov         dword ptr [rsp+20h],2Ah 

在 from-VB 中指的是十六进制 2A 的常量值,即十进制的 42。好了,它最终确实执行了更多指令。

关于c# - c# 编译器比 VB.NET 编译器更聪明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com