compiler-construction - 如何为这段代码创建无分支代码?

标签 compiler-construction computer-science compiler-optimization cpu-architecture micro-optimization

我需要为内部循环中的 if 语句生成无分支代码 如果(我!= j)。我很困惑如何生成无分支代码。

  for (int i = start; i < n; i++)
  {
        results[i] = 999;
        for (int j = 0; j < n; j++)
        {
            if (i != j)
            {
                d = myfunction(x, y, i, j);
                if (d < results[i])
                    results[i] = d;
            }
        }
    }

最佳答案

在 C++ 中,比较返回 0(假)或 1(真)。所以你可以将最里面的条件转换如下:

int condition = d < results[i] 
results[i] = d * condition + results[i] * !condition;

要跳过内循环中的 i,只需在 i 及之后的参数中添加 1:

...
for (int j = 0; j < n - 1; j++) {
    d = myfunction(x, y, i, j + (j >= i));
    int condition = d < results[i] 
    results[i] = d * condition + results[i] * !condition;
}
...

比较次数较少的另一种选择是将内部循环分成两个循环:

for (int j = 0; j < i; j++) {
   ...
}
for (int j = i + i; j < n; j++) {
   ...
}

编辑:复杂增量/循环开始修饰被替换。

P.S.:优化选项可能是在局部变量中构建最小值并仅在内部循环之后分配给 results[i]。

关于compiler-construction - 如何为这段代码创建无分支代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47240899/

相关文章:

c - 优化发生在哪个编译阶段

c - 如何在具有唯一元素的微型数组中尽快找到匹配元素?

c - 为什么大多数编译器不能做取模计算组合优化?

c - 自动生成 C 结构构造函数?

linux - 虚拟表未生成

go - slice 或数组是否充当全局范围?

time-complexity - 理解时间复杂度 : iterative algorithm

c - 使用 GCC 的软件流水线示例

.NET:运行带有调试信息的程序

javascript - 什么是必要的逃生舱口?