5

ゼロまたはゼロ以外の入力に依存する数式がある場合(テンプレート引数、コンパイル時に既知)、オプティマイザーは方程式を評価し、0または1に評価されることがわかっている式を最適化します。

例えば:

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

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

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

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

オプティマイザーはこれを理解してコード内またはコード内の他の場所に置き換えることができますかx、それともこれらの計算は実行時に実行されますか?01

私はgcc4.7を使用しています-O3

4

1 に答える 1

1

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

-03式が整数に関連している限り、gcc4.6.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);
}

結果として生じるアセンブリ

    .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
于 2012-05-02T03:06:06.877 に答える