使用 noexcept 优化 std::bitset
Optimizing std::bitset with noexcept
我有一些代码需要检查是否设置了位字段中的位。我对优化 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
,所以它不能忽略异常.
我有一些代码需要检查是否设置了位字段中的位。我对优化 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
,所以它不能忽略异常.