在c++中最小化分支-如果值是非零则递增

Minimize branching in C++ - Increment if value is non-zero

本文关键字:零则 是非 c++ 最小化 分支 如果      更新时间:2023-10-16

我有以下嵌套的for循环:

for(k = 0; k < n; ++k) {
    for(m = 0; m < n; ++m) {
        /* other logic altering a */
        if(a[index] != 0) count++;
    }
}

,其中a包含uint32_t。由于n可以相当大(但常数),这是唯一的分支(除了比较kmn),我想优化这一点。

可以认为a中0和非0的分布是均匀随机的。

我的第一个方法是

count += a[index] & 1;

但是count只会对所有奇数加1。

另外:我还有一个a包含bool的情况,但是根据c++条件,truefalse被定义为非零和零,基本等同于上面的问题

正如问题if(a[index] != 0) count++;没有产生分支(在这种情况下)的评论所述,这在程序集中得到了一定程度的验证。

为了完整起见,与上述语句等价的语句是count += a[index] != 0;(根据标准§4.7 [conv.integral])