9

ハッカーの好奇心から、どうすれgccばこの下の機能を賢く最適化できるのだろうか?

int c() {
        int i, j = 0;
        for (i = 0; i < 10; i++) {
                j += i;
        }
        return j;
}

$objdump -D c.o以下はアーム用ですが、x86のロジックに違いはありません。

00000000 <c>:
   0:   202d        movs    r0, #45 ; 0x2d
   2:   4770        bx  lr

これは一連の最適化の結果なのか、それともテンプレートの一致のようなものなのか、ほとんど疑問に思います。そのような最適化に関するドキュメントはありますか?

4

1 に答える 1

12

オプティマイザーはこれをフェーズ/パスで行います... -O2 を指定すると、有効になる多くの最適化があります。ここで重要な最適化は次のとおりです。

  1. ループ展開
  2. 絶え間ない伝播
  3. 一定の折り畳み
  4. デッドコードの排除

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

だからこのコード

int i, j = 0;
for (i = 0; i < 10; i++) {
    j += i;
}
return j;

ループ展開後

int i, j = 0;
i=0; j += i;
i=1; j += i;
i=2; j += i;
i=3; j += i;
i=4; j += i;
i=5; j += i;
i=6; j += i;
i=7; j += i;
i=8; j += i;
i=9; j += i;
return j;

定数伝播パスの後

int i, j = 0;
i=0; j += 0;
i=1; j += 1;
i=2; j += 2;
i=3; j += 3;
i=4; j += 4;
i=5; j += 5;
i=6; j += 6;
i=7; j += 7;
i=8; j += 8;
i=9; j += 9;
return j;

デッドコード除去後

j = 0;
j += 0;
j += 1;
j += 2;
j += 3;
j += 4;
j += 5;
j += 6;
j += 7;
j += 8;
j += 9;
return j;

一定の折り畳み

j = 45;
return j;

そして最後に、

return 45;
于 2013-02-19T09:34:05.137 に答える