gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:58 25 4
gpt4 key购买 nike

考虑一下:

#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_personalityCall 1 的任何异常处理代码。

当使用不同的编译器时,可以依赖这样的优化吗?我只考虑 C++11 及更高版本。

最佳答案

noexcept 说明符被添加到 c++11 作为 throw() 的替代品。它保证函数不会抛出。它与 throw() 的区别在于,使用 noexcept 时,如果函数实际抛出,则堆栈可能会展开,前者不是这种情况(堆栈总是展开)。这可以实现更多优化,例如完全省略异常处理。

总而言之,由编译器决定是否省略异常处理,但是使用 noexcept 它没有理由不这样做,这真的很难做到其他情况下确定。

关于c++ - 如果一个 try-catch block 被证明是非抛出的,编译器必须总是删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52695703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com