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块是“死代码”(或者不是?),或者如果它可以识别它,为什么它不优化它。
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |