考虑一下:
#include <stdexcept>
template <class T>
void F(T &&t) {
try {
t();
} catch(...) {}
}
int main() {
F([]() noexcept {}); // Call 1
F([]{}); // Call 2
F([]{ throw std::exception{}; });// Call 3
}
我在clang++-6.0
上发现带有标志-std=c++17
,无论我给出的优化标志如何,总是没有__gxx_personality
以及 Call 1
的任何异常处理代码。
使用不同的编译器时可以依赖这样的优化吗?我只考虑 C++11
及以上版本。
最佳答案
noexcept
说明符已添加到 c++11 中,作为 throw()
的替代。它保证函数不会抛出。它与 throw()
的区别在于,使用 noexcept
时,如果函数实际上抛出,堆栈可能只会被展开,前一个情况并非如此(堆栈总是展开)。这可以实现更多优化,例如完全省略异常处理。
总而言之,编译器决定忽略异常处理,但使用 noexcept
它没有理由不这样做,这真的很难其他情况确定。
关于c++ - 如果 try-catch block 被证明是非抛出的,编译器必须始终删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52695703/