找到选项-funroll-all-loops
时,我正在阅读optimization options for GCC。
其描述为:
如果在编译时未知迭代次数,编译器如何展开循环?编译器不需要此信息来展开它吗?它生成什么相应的C代码,并且如果它通常使程序运行得更慢,那么在什么情况下这会有用呢?
最佳答案
好吧,他们假设如果您选择此选项,您就知道自己在做什么,如果您不这样做,则不应该使用此选项。
gcc将要做什么,那么我使用了以下示例程序:
#include <stdio.h>
void f(int j )
{
for( int k = 0; k < j; ++k )
{
printf( "%d\n", k ) ;
}
}
并使用godbolt对其进行了测试,并根据剩余的迭代次数(see it live)生成了一个跳转表:
cmpl $1, %ebp
movl $1, %ebx
je .L1
testl %r12d, %r12d
je .L27
cmpl $1, %r12d
je .L28
cmpl $2, %r12d
je .L29
cmpl $3, %r12d
je .L30
cmpl $4, %r12d
je .L31
cmpl $5, %r12d
je .L32
cmpl $6, %r12d
je .L33
关于c - 如果在编译时未知迭代次数,GCC如何展开循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31167051/