c++ - 最小化 C++ 中的分支 - 如果值不为零则递增

标签 c++ performance for-loop branch-prediction

我有以下嵌套的 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 中零和非零的分布可以认为是均匀随机的。

我的第一个方法是

count += a[index] & 1;

但是 count 只会对所有奇数递增。

另外:我也遇到过a包含bool的情况,但是根据C++ Conditionals truefalse定义为非零和零,基本等价于上述问题。

最佳答案

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

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

关于c++ - 最小化 C++ 中的分支 - 如果值不为零则递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30272738/

相关文章:

javascript - 在 Javascript 中迭代对象属性

c++ - 我可以将参数传递给 std::vector 排序函数吗?

c++ - 缓存刷新后的时间不确定性非常高

c++ - 向 iOS 应用程序添加 64 位切片会导致崩溃

java - .toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?

c# - 在某些地方防止 GC 收集以提高性能

objective-c - NSArray 循环抓取对象

java - 嵌套 For 循环的有效替代方案

c++ - 修改链表主要功能代码,用户将在其中输入带有正确消息的节点的索引和数据

c++ - 访问 opencv 矩阵 CV_32S 元素