2012-05-19 7 views
5

は、私は、アセンブリに翻訳されましたどのように特定のC/C++の機能に見てみたかったと私は、次のファイルを作成しました:私は、その後(g++ -Sでも試してみました)gcc -Sでこれをコンパイルgccが冗長アセンブリコードを作成するのはなぜですか?

struct foo { 
    int x; 
    char y[0]; 
}; 

char *bar(struct foo *f) 
{ 
    return f->y; 
} 

を私が見たときにライン

、とりわけ

_bar: 
Leh_func_begin1: 
     pushq %rbp 
Ltmp0: 
     movq %rsp, %rbp 
Ltmp1: 
     movq %rdi, -8(%rbp) 
     movq -8(%rbp), %rax 
     movabsq $4, %rcx 
     addq %rcx, %rax 
     movq %rax, -24(%rbp) 
     movq -24(%rbp), %rax 
     movq %rax, -16(%rbp) 
     movq -16(%rbp), %rax 
     popq %rbp 
     ret 
Leh_func_end1: 

を:アセンブリコード、私はgccが離れて最適化することができるはずと思っバー機能に些細な冗長性を見つけることが失望しました

 movq %rax, -24(%rbp) 
     movq -24(%rbp), %rax 
     movq %rax, -16(%rbp) 
     movq -16(%rbp), %rax 

は無意味なようです。 gcc(そしておそらく他のコンパイラ)がこれを最適化できない理由がありますか?

+1

標準的な最適化を有効にするには、-Oスイッチを指定してgccを実行してください。 –

+0

どのバージョンのgccを使用していますか? –

答えて

11

私はgccが最適化できるはずだと思いました。 gcc manualから

任意の最適化オプションを指定しない場合、コンパイラのゴールは、コンパイルのコストを削減すると期待される結果を生成、デバッグすることです。

つまり、要求しない限り、最適化されません。詳細については

bar: 
.LFB0: 
     .cfi_startproc 
     leaq 4(%rdi), %rax 
     ret 
     .cfi_endproc 

、手動でOptions That Control Optimizationを参照してください。私は-O3フラグを使用して最適化をオンにすると、GCC 4.4.6は、はるかに効率的なコードを生成します。

+0

ああ、私は標準の最適化がデフォルトでオンになると仮定しました。なぜ彼らはいないのですか? – Matt

+7

@Matt:マニュアルを引用すると、「最適化オプションがなければ、コンパイルのコストを削減し、デバッグが期待した結果を出せるようにすることが目標です。 – NPE

+1

@Mattそして、実装者がそう選んだので。あなたがここで彼らの1人から答えを得点しない限り、それは無益な質問です。 – EJP

8

最適化せずに生成するコードは通常、命令ごとの直接命令であり、プログラムの命令ではなく、冗長性が導入された中間表現の命令です。

あなたは、このような冗長な指示なしアセンブリ予想される場合

は、 gcc -O -S

あなたはpeephole optimizationと呼ばれている期待していた最適化の種類を使用します。より多くのグローバルな最適化とは異なり、適用するのは安価であり、コンパイルの最後に向かって適用するとコードを悪化させる危険性はありません(一般的に)。

this blog postでは、ソースコードの整数型が64ビットであり、結果のうちの最小の32ビットのみである場合、GCCとClangの両方が短い32ビット命令を生成する例を示します。

関連する問題