展开循环时,调用的最终迭代是什么?

时间:2017-12-02 21:46:18

标签: performance terminology loop-unrolling

如果一个循环由N展开,重复身体N次并将行程计数减少N倍,则可能需要0到N-1"最后的迭代"循环之后 - 如果您的原始行程计数不是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 + 6 1 的内容。你还需要一些&#34;最后的迭代&#34;处理可能与原始循环一样简单:

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

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

3 个答案:

答案 0 :(得分:1)

一些建议:

答案 1 :(得分:0)

余数迭代”如何?尽管我不知道这是否是一个公认的术语,但它很符合“剩余”的定义。

答案 2 :(得分:-2)

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

展开循环时,最终的迭代调用是什么?

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

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

注意:我通常以内联方式定义内容。例如,如果我反复提到“结束部分”(处理任何剩余迭代的循环后部分),那么我可能会解释一次,然后对以后的每次出现只说“结束部分”并依靠读者记住我所说的“末端”。