return可以抛出异常吗?
c#
在玩 C# 时,我发现了以下代码段:
public int F()
{
try
{
return 0;
}
catch (Exception)
{
return -1;
}
}
这将生成以下asm:
Program.F()
L0000: push ebp
L0001: mov ebp, esp
L0003: push esi
L0004: sub esp, 0x14
L0007: xor eax, eax
L0009: mov [ebp-0x18], eax
L000c: mov [ebp-0x14], eax
L000f: mov [ebp-0x10], eax
L0012: mov [ebp-0xc], eax
L0015: xor esi, esi
L0017: jmp short L0023
L0019: mov esi, 0xffffffff
L001e: call 0x6fb2d4d3
L0023: mov eax, esi
L0025: lea esp, [ebp-4]
L0028: pop esi
L0029: pop ebp
L002a: ret
Program.F()
L0000: push ebp
L0001: mov ebp, esp
L0003: push esi
L0004: sub esp, 0x14
L0007: xor eax, eax
L0009: mov [ebp-0x18], eax
L000c: mov [ebp-0x14], eax
L000f: mov [ebp-0x10], eax
L0012: mov [ebp-0xc], eax
L0015: xor esi, esi
L0017: jmp short L0023
L0019: mov esi, 0xffffffff
L001e: call 0x6fb2d4d3
L0023: mov eax, esi
L0025: lea esp, [ebp-4]
L0028: pop esi
L0029: pop ebp
L002a: ret
当我删除try和catch阻止时:
那么生成的输出是:
Program.F()
L0000: xor eax, eax
L0002: ret
题
正如您所看到的,JIT (Release) 知道它不会返回-1(您找不到任何会跳转到return -1case 的分支),但它确实为return 0case生成了 try 块。问题是 return 语句是否会抛出异常或者为什么 JIT 会为其生成asm?
笔记
相比之下:这就是输出g++(O2) 的内容C++。
public int F()
{
return 0;
}
汇编
f(void*):
xor eax, eax
ret
回答
由于语句中允许的表达式的通用性质,return 语句通常会导致异常——通常,表达式会导致异常。
知道表达式0不能抛出,JIT 是否应该优化异常处理?也许,在一个完美的世界里。有人抱怨这个吗?