我需要为内部循环中的 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/