2012-05-02 15 views
5

Se ho alcune equazioni matematiche che si basano su input che possono essere zero o non-zero (argomento template, noto al momento della compilazione), l'ottimizzatore valuterà le equazioni e ottimizzerà le espressioni che sa valuterà a 0 o 1.Un ottimizzatore dedurrà espressioni matematiche basate su costanti in fase di compilazione?

Ad esempio:

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

se Eval<type>::value è 0, x sarà sempre 0.

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

se Eval<type>::value è 0, x sarà sempre 1.

L'ottimizzatore può calcolare questo e sostituirecon 0 o 1 altrove nel codice o questi calcoli verranno eseguiti in fase di esecuzione?

Sto usando gcc 4.7 con -O3

+3

Se si ha familiarità con il montaggio, si può solo guardare l'output per quella determinata. – Mysticial

+0

Scommetto che potresti persino costringerlo a farlo in fase di compilazione con abbastanza trucchetti (SFINAE e quant'altro). – Lalaland

+1

L'unica risposta veramente corretta che può essere data alle domande di questo modulo è "è permesso, ma non è richiesto a". In questo caso, aggiungi una zuppa di "il compilatore di solito non può fare molta ottimizzazione algebrica sui calcoli in virgola mobile a meno che tu non usi l'opzione 'vai avanti e ottimizzi per la velocità a scapito dell'opzione * correctness *'." – zwol

risposta

1

EDIT: ho sbagliato, il compilatore funziona come previsto quando si utilizza un numero in virgola mobile.

Bene gcc 4.6.3 in -03 sicuramente sembra farlo, purché l'espressione sia in relazione con l'intero.

codice Esempio:

#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); 
} 

Con conseguente montaggio

.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

Questo funziona solo per la prima espressione, la seconda espressione è più complessa e richiede il materiale dei template –

Problemi correlati