我有以下嵌套的 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
中零和非零的分布可以认为是均匀随机的。
我的第一个方法是
count += a[index] & 1;
但是 count
只会对所有奇数递增。
另外:我也遇到过a
包含bool
的情况,但是根据C++ Conditionals true
和false
定义为非零和零,基本等价于上述问题。
最佳答案
如问题 if(a[index] != 0) count++;
不产生分支(在本例中)的评论中所述,这在程序集中得到了一定程度的验证。
为了完整起见,与上述语句等效的是 count += a[index] != 0;
(根据标准 §4.7 [conv.integral])
关于c++ - 最小化 C++ 中的分支 - 如果值不为零则递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30272738/