gpt4 book ai didi

c# - return 可以抛出异常吗?

转载 作者:行者123 更新时间:2023-12-03 14:25:28 28 4
gpt4 key购买 nike

在玩 C# 时,我发现了以下代码段:

public int F() 
{
try
{
return 0;
}
catch (Exception)
{
return -1;
}
}
这会生成以下 组装 :
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块:
public int F() 
{
return 0;
}
那么生成的输出是:
Program.F()
L0000: xor eax, eax
L0002: ret
问题
正如你所看到的,JIT (Release) 知道它不会返回 -1 (你找不到任何跳转到 return -1 cas​​e 的分支),但它确实为 return 0 生成了 try 块。案例。问题是 return 语句是否会抛出异常或者为什么 JIT 会为其生成 asm?
注意
相反:这就是输出 g++ (O2) 为 C++ .
int 
f(void *this_) {
try {
return 0;
}
catch(...) {
return -1;
}
}
组装
f(void*):
xor eax, eax
ret

最佳答案

由于语句中允许的表达式的通用性质,return 语句通常会导致异常——通常,表达式会导致异常。
知道表达式 0,JIT 是否应该优化异常处理?不能扔?也许,在一个完美的世界里。有人提示这个吗?

关于c# - return 可以抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66928580/

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