使用 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 );
}

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

Is there anything else I can do to optimize this code?

是的!就像其他容器一样,std::bitset 具有获取特定位的功能,可以进行边界检查,也可以不进行边界检查。 test 是边界检查函数,抛出。

但是如果你有其他测试来确保m不会太高,那么你可以使用std::bitsetoperator[]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,所以它不能忽略异常.