我有一些代码需要检查是否设置了位字段中的位。我对优化的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 );
}
答案 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>