- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果我查看在 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 会消除执行时的任何差异。
编辑
我检查了一下,实际上执行的 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/
我正在尝试切换(某种)命令。 if 'Who' in line.split()[:3]: Who(line) elif 'Where' in line.split()[:3]: W
基本上我是在一个物理游戏中计算阻力。侧向运动需要减少(如接近 0,而不仅仅是负数),但我不知道它在哪个方向行进,所以我不知道是增加阻力还是减去阻力。 (如果一个项目向右移动,它有正向力,向左移动,负向
我有以下表格 CREATE TABLE Foos ( [Id] INT IDENTITY, -- Other fields ) CREATE TABLE Boos ( [Id]
我正在运行一个非常简单的程序 static void Main(string[] args) { Console.WriteLine(Get4S());
PHP $total_points = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM account WHERE id='$id'"),0
我是一名优秀的程序员,十分优秀!