找到选项-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/

10-09 09:40