首页 > 解决方案 > 在 C 中展开 For 循环

问题描述

我试图将这个循环展开 2 倍。

for(i=0; i<100; i++){
  x[i] = y[i] + z[i];
  z[i] = y[i] + a[i];
  z[i+1] = y[i] * a[i];
}

我把它展开到:

 for(i=0; i<100; i+=2){
   x[i] = y[i] + z[i];
   x[i+1] = y[i+1] + z[i+1];
   z[i] = y[i] + a[i];
   z[i+1] = y[i] * a[i];
 }

我不确定如何展开 z[i] 的行,因为原始 for 循环已经有 z[i+1]。谁能帮我理解这一点?

标签: coptimizationloop-unrolling

解决方案


我想说简单地为 i+1 添加行。但是您必须确保它们的顺序正确,因此:

 for(i=0; i<100; i+=2){
    x[i] = y[i] + z[i];
    z[i] = y[i] + a[i];
    z[i+1] = y[i] * a[i];

    // next iteration
    if (i+1 < 100) {
          x[i+1] = y[i+1] + z[i+1];
          z[i+1] = y[i+1] + a[i+1];
          z[i+2] = y[i+1] * a[i+1]; 
    }
 }

编辑

为了使所有上限(不仅是偶数)安全,您必须在循环中添加一个 if

正如 Adrian Mole 提到的,最好首先检查上限或方便地设置数组的大小


推荐阅读