c++ - 如果 try-catch block 被证明是非抛出的,编译器必须始终删除它

标签 c++ c++11 optimization exception try-catch

考虑一下:

#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/

相关文章:

c++ - 多项式最大公约数 C++

C++如何生成函数重载的所有排列?

c++ - 什么时候使用初始化列表构造函数?

r - 在R中快速生成数字序列的方法

c++ - 编译器会删除始终计算为零的 If block 吗?

c++ - 如何在实时流应用程序上使用 mpi?

c++ - 类型 ‘int’ 和 ‘const char [15]’ 到二进制 ‘operator<<’ 的无效操作数 ^

c++ - 来自 WMI 的 nVidia 驱动程序版本不是我想要的

c++ - 我将如何使用初始值设定项列表直接创建我的链接列表?

mysql - 优化大数据的 MySQL 交集查询