编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
Must a compiler always remove a try-catch block if it's proven to be non-throwing
考虑一下:
#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
,无论我给出的优化标志如何,Call 1
始终没有__gxx_personality
和任何异常处理代码。
使用不同的编译器时是否可以依赖这种优化?我只考虑C++11
及以上。
noexcept
说明符被添加到 C++11 中,作为throw()
的替代品。它保证函数不会抛出。它和throw()
之间的区别在于,对于noexcept
,如果函数实际抛出,堆栈只会被展开,而前者则不是这种情况(堆栈总是被展开(。这样可以进行更多优化,例如完全省略异常处理。
总而言之,当编译器决定省略异常处理时,这取决于编译器,但noexcept
它没有理由不这样做,这在其他情况下真的很难确定。
相关文章:
- 使用分辨率定理用Z3证明
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 证明构造函数体内的辅助是低效的
- 尝试读取/写入Graphviz DAG值的工作证明会导致segfault
- 如何证明以下算法具有 O(nlogn) 时间复杂度
- 声明"使用命名空间 C;"对于证明 [namespace.udir]/3 中的示例中显示的结果至关重
- 证明shrink_to_fit或交换保证释放矢量的内存
- 请证明这一点的合理性 C++.
- 如何证明 -> 在 int* pMember = &(pSomeType->SomeIntMember) 时不用于顺从;
- 无法理解使用这张地图背后的证明<>方法
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 证明两指针方法有效(对和)
- 用SETW证明文本是合理的
- 我试图证明一个给定的树是一个二进制搜索树.我将输入一个二叉树,我只想让函数返回true
- 使用引用相对于使用指针的优势是否证明偶尔"null-references"是合理的?
- 无锁堆栈-这是c++11宽松原子的正确用法吗?它能被证明吗
- 断言是错的,用证据证明
- 这个简单的 Message 类是否证明使用智能指针是合理的