请参阅以下代码,其中包含调用另一个抛出函数的函数的 3 个实现。
# include <stdexcept>
void f()
{
throw std::runtime_error("");
}
void g1()
{
f();
}
void g2() noexcept
{
f();
}
void g3() noexcept
{
try{ f(); } catch(...){ std::terminate(); }
}
int main()
{
return 0;
}
根据我对规范的理解noexcept
,g2
和g3
是严格等效的。但是,当我使用 GCC 在编译器资源管理器中编译它时,生成的代码对于g1
and是严格等效的g2
,但对于 则不是g3
:
g1():
push rbp
mov rbp, rsp
call f()
nop
pop rbp
ret
g2():
push rbp
mov rbp, rsp
call f()
nop
pop rbp
ret
g3():
push rbp
mov rbp, rsp
call f()
jmp .L9
mov rdi, rax
call __cxa_begin_catch
call std::terminate()
.L9:
pop rbp
ret
为什么 ?