0

如果一个循环被 N 展开,将主体复制 N 次并将行程计数减少 N 倍,则在循环之后您可能需要 0 到 N-1 次“最终迭代”——如果您的原件会发生非零情况trip-count 不是 N 的倍数。

这些最终迭代称为什么?


例如,以下循环:

int sum = 0;
for (int i = 0; i < max; i++) {
  sum += i;
}

可以展开 4 倍,如下所示:

int sum = 0;
for (int i = 0; i + 3 < max; i += 4) {
  sum += i;
  sum += i + 1;
  sum += i + 2;
  sum += i + 3;
}

// "final iterations" handling here

...作者可能会将整个正文简化为sum += i *4 + 61。您还需要一些“最终迭代”处理,这可能与原始循环一样简单:

// handle the final 0 to 3 iterations
for (; i < max; i++) {
  sum += i;
}

1事实上,编译器可能会在简化原始循环方面做得更好,通常将其完全删除并通过基于求和公式的乘法直接计算最终结果。毕竟,这只是一个例子。

4

3 回答 3

1

Just a few suggestions:

于 2020-09-10T20:06:54.263 回答
0

剩余迭代”怎么样?它很好地符合“剩余”的定义,尽管我不知道它是否是一个公认的术语。

于 2020-09-10T02:08:36.787 回答
-2

我将其称为“处理任何剩余迭代的循环之后的部分”。

当一个循环展开时,最后的迭代叫什么?

问题是该问题假定它具有“标准”/众所周知的名称;但这将是愚蠢的(如果您为每个小而常见的代码片段命名,那么您将拥有如此多的名称,以至于没有人会记住它们,这将破坏分配名称可能具有的任何目的)。

当然(对于文档)这并不排除使用临时名称或临时短语来提高简洁性;要么由词汇表定义,要么由内联定义(见注),要么由上下文定义。

注意:我通常定义内联的东西。例如,如果我反复提到“结束部分”(处理任何剩余迭代的循环之后的部分),那么我可能会解释一次,然后为以后的每一次出现只说“结束部分”并依赖于读者记住我所说的“结尾部分”是什么意思。

于 2020-09-03T20:57:32.973 回答