在C++中,以下代码为:
与像这样只调用
如果是这样的话,我能否期望一款最先进的编译器将第一个版本转换为第二个版本(在启用优化时进行编译)?
换句话说,如果我使用
我可以为您进行翻译。该句的意思是:我可以假定这个版本不会比这个丑陋版本更慢吗?
try {
foo();
} catch (...) {
throw;
}
与像这样只调用
foo
在语义上相同吗?foo();
如果是这样的话,我能否期望一款最先进的编译器将第一个版本转换为第二个版本(在启用优化时进行编译)?
换句话说,如果我使用
NDEBUG
和启用了优化来编译此代码。try {
foo();
} catch (...) {
assert(some_check());
throw;
}
我可以为您进行翻译。该句的意思是:我可以假定这个版本不会比这个丑陋版本更慢吗?
#ifndef NDEBUG
try {
#endif
foo();
#ifndef NDEBUG
} catch (...) {
assert(some_check());
throw;
}
#endif
foo
不能抛出异常(编译器知道这一点,例如通过noexcept
),编译器将删除任何相关的异常处理分支。但问题比那更普遍。 - Veedractry { throw 0; } catch (...) {}
和try { throw 0; } catch (...) { throw; }
看起来生成的代码不太优化,但异常并不容易优化。 - Veedrac