c++ - 使用 noexcept 优化 std::bitset

标签 c++ c++11 exception 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

最佳答案

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,所以它不能忽略异常。

关于c++ - 使用 noexcept 优化 std::bitset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231792/

相关文章:

c++ - 如何以与平台无关的方式终止卡在阻塞 IO 上的线程?

exception - 如何在 Odoo 10 中引发自定义异常?

c++ - 从未知结构 C++ 构造树(非二进制)结构

c++ - C++中的简单矩阵求幂

c++ - 在 vector 中存储重复字符串时节省内存?

c++ quaternion 澄清

c++ - 将左值绑定(bind)到右值引用 move 构造函数和函数返回

c++ - 在 C++ 中动态提供函数参数

java - Android ListView 数组索引越界异常 - 没有线索?

c++ - C++异常捕获迟了,这可能是什么原因?