C++ C++;循环展开、边界

C++ C++;循环展开、边界,c++,performance,loops,C++,Performance,Loops,我想展开一个循环: for(int i = 0; i < N; i++) do_stuff_for(i); for(int i=0;i

我想展开一个循环:

for(int i = 0; i < N; i++)
    do_stuff_for(i);
for(int i=0;i
展开:

for(int i = 0; i < N; i += CHUNK) {
    do_stuff_for(i + 0);
    do_stuff_for(i + 1);
    ...
    do_stuff_for(i + CHUNK-1);
}
for(int i=0;i
但是,我应该确保不会耗尽原始的N,比如当N==14和CHUNK==10时。我的问题是:什么是最好的/最快的/标准的/最优雅的(你说的)方式

一个解决方案是:

int i;
for(i = 0; i < (N % CHUNK); i++) 
    do_stuff_for(i);

for(i; i < N; i += CHUNK) {
    // unfolded, for the rest
}   
inti;
对于(i=0;i<(N%块);i++)
为(i)做事;
对于(i;i

但也许有更好的做法

您可以使用开关盒


它叫

为什么展开?你的编译器不支持优化吗?@ Toalalk Geelt'Kal: Visual C++ 10通常不会尝试这种激进的优化。模板化的解决方案?这使得现代(grin)编译器很容易禁用它。@TomalakGeret'kal:我注意到,当我自己这样做时,我会获得性能提升。展开的“最佳方式”是让编译器来做。它将知道内部的最佳迭代次数,并自动生成最后的非偶数迭代。这就需要进行微优化,这将使您的维护成本远远高于您的报酬。我对这个D.D.印象深刻@yi_H:的确,幸运的是,这是一个众所周知的小优化技巧,通常现在已经过时了(尽管在低级例程中有时可能需要它)。