2012-05-02 7 views
5

入力に依存する0または非ゼロ(テンプレート引数、コンパイル時に知られている)に依存する数式がある場合、オプティマイザは方程式を評価し、0または1と評価される式を最適化します。オプティマイザは、コンパイル時定数に基づいて数式を推論しますか?

例えば

0ある

double x = y * Eval<type>::value; 

Eval<type>::value場合、xは常に0になります。

double x = exp(y * Eval<type>::value); 

Eval<type>::value0であれば、xは常に1になります。

x0または1と置き換えるか、実行時にこれらの計算を実行できますか?

EDIT -O3

+3

結果として得られる

#include <cstdio> inline int x(double y) { if (y == 0) printf("Hello bob3\n"); else printf("Why do I bother\n"); }; const int c = 0; int main() { int f; scanf("%d",&f); x(f * c); } 

あなたがアセンブリに精通している場合、あなただけのことのアセンブリ出力を見ることができます。 – Mysticial

+0

私は、コンパイル時に十分なトリッキー(SFINAEなど)でこれを強制することさえできると確信しています。 – Lalaland

+1

このフォームの質問に与えられる真の正解は、「それは許されますが、必須ではありません」だけです。この場合、「コンパイラは、通常、浮動小数点計算で大量の代数最適化を行うことはできません。 – zwol

答えて

1

と私は、GCC 4.7を使用しています:私は浮動小数点数を使用すると、期待どおりコンパイラは動作しますが、間違っていました。

よくgcc 4.6.3 in -03は、式が整数関連である限り、これを行うように見えます。

コード例:アセンブリ

.file "foo.cpp" 
    .section .rodata.str1.1,"aMS",@progbits,1 
.LC0: 
    .string "%d" 
.LC1: 
    .string "Hello bob3" 
    .section .text.startup,"ax",@progbits 
    .p2align 4,,15 
    .globl main 
    .type main, @function 
main: 
.LFB13: 
    .cfi_startproc 
    subq $24, %rsp 
    .cfi_def_cfa_offset 32 
    movl $.LC0, %edi 
    xorl %eax, %eax 
    leaq 12(%rsp), %rsi 
    call scanf 
    movl $.LC1, %edi 
    call puts 
    xorl %eax, %eax 
    addq $24, %rsp 
    .cfi_def_cfa_offset 8 
    ret 
    .cfi_endproc 
.LFE13: 
    .size main, .-main 
    .ident "GCC: (Debian 4.6.3-1) 4.6.3" 
    .section .note.GNU-stack,"",@progbits 
+0

これは最初の式でのみ機能し、2番目の式はより複雑でテンプレート化するものが必要です –

関連する問題