使用noexcept优化std :: bitset

时间:2017-11-10 22:01:48

标签: c++ c++11 exception-handling std bitset

我有一些代码需要检查是否设置了位字段中的位。我对优化的std :: bitset.count如何编译感到印象深刻,所以认为这也是一个很好的用途。我很惊讶当我使用bitset.test时,编译器仍在检查异常,即使我添加了noexcept。

我还有其他检查以确保我不会测试超出范围的位。我还能做些什么来优化这段代码吗?

bool bitset_test(int n, size_t m) noexcept {
    // The caller already verifies m is within range
    return std::bitset<64>( n ).test( m );
}

编译输出:https://godbolt.org/g/uRggXD

1 个答案:

答案 0 :(得分:3)

  

我还能做些什么来优化这段代码吗?

是的!就像其他容器一样,std::bitset具有一个函数来获取具有和不具有边界检查的特定位。 test是边界检查函数,它抛出。

但如果你有其他测试来确保m不是太高,那么你可以使用std::bitset的{​​{1}},which doesn't have any exception handling in the resulting assembly,因为它假设你正在传递一个正确的值:

operator[]

正如其他人所提到的,编译器仍在生成的程序集中生成异常的原因是,如果抛出异常,编译器仍然必须调用bool bitset_test(int n, size_t m) noexcept { return std::bitset<64>(n)[m]; } ,因此它不能只忽略异常。 / p>