在c++中最小化分支-如果值是非零则递增
Minimize branching in C++ - Increment if value is non-zero
我有以下嵌套的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])
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在没有太多条件句的情况下,我如何避免被零除
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 矩阵向量乘法(cublasDgemv)返回零
- 使用正则表达式regex_search在字符串中查找字符串
- 是否可以对零模板参数进行模板专门化
- 处理除以零会导致<csignal>意外行为
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- 如果我不打印函数参数的值,则将其转换为等于零
- 当 M 是奇数时,如果它是对角线的中间,则在对角线交换后显示零
- 带虚拟COM端口的USB串行设备-如果使用带USB路径的CreateFile(),则ReadFile()读取零字节
- C++ 二叉树:返回节点的后代数.一片叶子有零.如果未找到树数据,则返回 -1
- C++While循环,如果数组等于零,则停止该循环
- 正则表达式不能以零开头
- 既然b总是非零的,为什么是b--b:++b`有效,但`--b`无效
- 在c++中最小化分支-如果值是非零则递增