在编译时知道for循环的迭代次数是否有优势?

Hen*_*all 1 c optimization opencl

在编译时知道for循环应该进行多少次迭代是否有一些优势?

例如,在某些情况下,编译器可以生成一个可执行程序,运行速度更快,因为:

#define ITERATIONS 10
int foo()
{
    for (int i=0; i < ITERATIONS; i++){
        do_something();
    }
}
Run Code Online (Sandbox Code Playgroud)

比这个:

int foo(int iterations)
{
    for (int i=0; i < iterations; i++){
        do_something();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果情况不是普遍的话,那些情况是什么?

我关注的是OpenCL的具体情况,所以我也有兴趣知道这是否与C不同.

Dav*_*rtz 7

我使用GCC在相当现实的情况下进行了测试.当编译时已知循环数时,我得到:

.L2:
    call    do_something
    subl    $1, %ebx
    jne .L2
Run Code Online (Sandbox Code Playgroud)

如果不是,我得到这个:

.L6:
    call    do_something
    addl    $1, %ebx
    cmpl    %ebp, %ebx
    jne .L6
Run Code Online (Sandbox Code Playgroud)

因此,通过将计数降低到零循环而不是向上计数循环,它能够稍微优化固定的迭代次数.如果不出意外,这会使用更少的代码缓存.

具有更高的优化级别,它完全展开一个调用外部函数十次的循环.据推测,除非它认为它更好,否则它不会那样做.如果迭代次数未知,肯定不能这样做.

简短回答:固定的迭代次数为编译器提供了更多选择.至少在某些时候,这应该会产生非常好的代码.