我有一些代码需要检查位字段中的某个位是否已设置。我对优化的 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 );
}
最佳答案
Is there anything else I can do to optimize this code?
是的!就像其他容器一样,std::bitset
具有获取特定位的功能,可以进行边界检查,也可以不进行边界检查。 test
是边界检查函数,会抛出异常。
但是如果你有其他测试来确保m
不是太高,那么你可以使用std::bitset
的operator[]
,which doesn't have any exception handling in the resulting assembly ,因为它假定您传递的是正确的值:
bool bitset_test(int n, size_t m) noexcept {
return std::bitset<64>(n)[m];
}
正如其他人所提到的,编译器仍然在生成的程序集中生成异常的原因是,如果抛出异常,编译器仍然必须调用 std::terminate
,所以它不能忽略异常。
关于c++ - 使用 noexcept 优化 std::bitset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231792/