我有以下嵌套的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
可以相当大(但常数),这是唯一的分支(除了比较k
和m
与n
),我想优化这一点。
可以认为a
中0和非0的分布是均匀随机的。
我的第一个方法是
count += a[index] & 1;
但是count
只会对所有奇数加1。
另外:我还有一个a
包含bool
的情况,但是根据c++条件,true
和false
被定义为非零和零,基本等同于上面的问题
正如问题if(a[index] != 0) count++;
没有产生分支(在这种情况下)的评论所述,这在程序集中得到了一定程度的验证。
为了完整起见,与上述语句等价的语句是count += a[index] != 0;
(根据标准§4.7 [conv.integral])