更好的折叠循环索引计算

Any*_*orn 2 c c++ optimization performance

我有以下循环:

for (int ij =  begin; ij < ni*nj; ij += step) {
    int j = ij/ni;
    int i = ij - j*ni;
    ...
}
Run Code Online (Sandbox Code Playgroud)

i,j没有div/mod 可以计算什么其他选项?

展开循环不是一种选择.

Jam*_*nze 5

我用两个变量.在进入循环之前,你必须使用除法和模数 begin并且可能step(取决于有多大step),但它们在循环中不是必需的.如果 step小于和除数ni,那么以下应该做的伎俩:

int end = ni;
int i = begin % ni;
int firstJ = begin / ni;
int j = firstJ;
while ( i < ni ) {
    //  ...
    j += step;
    if ( j >= nj ) {
        ++ i;
        j = firstJ;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果step不是倍数nj - firstJ,你将不得不做一些关于处理其余事情的事情j >= nj.

我认为i并且j用于索引数据.根据数据的结构方式,可以更简单地预先添加begin(如果有指针),或者迭代忽略begin,begin在每次访问时添加.(如果你这样做,不要忘记纠正 ninj相应地.)