为什么编译器不能优化 try-catch 块中的单个 throw 语句?

Joe*_*oel 14 c++ error-handling exception try-catch compiler-optimization

我只是在编译器资源管理器中玩一些 C++ 代码,并在编译简单的try/catch块时注意到一些意外的行为。以下两个片段都是使用 gcc 使用优化标志编译的-O3实时示例)。

在第一个程序中,整个try/catch块被删除,因为行为上没有明显的差异,从而产生与return 0;. 这正是我期望编译器产生的结果。

int main() {
    try {
        int x{ 10 };
    }
    catch (...) {
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
main:
        xor     eax, eax
        ret
Run Code Online (Sandbox Code Playgroud)

在第二个片段中,我有throw一个例外,而不是仅仅初始化一个int. 抛出该异常后,我将继续使用catch-all 处理程序,该处理程序是空的。之后就只有return 0;声明了。这意味着该程序的可观察行为将与第一个程序相同。然而,大会表明,整个事情仍在try继续catch

int main() {
    try {
        throw 10;
    }
    catch (...) {
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
main:
        push    rcx
        mov     edi, 4
        call    __cxa_allocate_exception
        xor     edx, edx
        mov     esi, OFFSET FLAT:_ZTIi
        mov     DWORD PTR [rax], 10
        mov     rdi, rax
        call    __cxa_throw
        mov     rdi, rax
        call    __cxa_begin_catch
        call    __cxa_end_catch
        xor     eax, eax
        pop     rdx
        ret
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么编译器无法识别整个try/catch块是“死代码”(或者不是?),或者如果它可以识别它,为什么它不优化它。