2012-05-02 16 views
5

Si tengo algunas ecuaciones matemáticas que dependen de entradas que pueden ser cero o distintas de cero (argumento de plantilla, conocido en tiempo de compilación), el optimizador evaluará las ecuaciones y optimizará las expresiones que sabe que se evaluarán a 0 o 1.¿Un optimizador deducirá expresiones matemáticas basadas en constantes de tiempo de compilación?

Por ejemplo:

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

si es Eval<type>::value0, x siempre habrá 0.

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

si es Eval<type>::value0, x siempre habrá 1.

¿Puede el optimizador resolver esto y reemplazar x con 0 o 1 en otro lugar en el código, o estos cálculos se llevarán a cabo en tiempo de ejecución?

estoy usando gcc 4.7 con -O3

+3

Si está familiarizado con el montaje, se puede simplemente mirar a la salida de montaje de eso. – Mysticial

+0

Apuesto a que incluso podrías forzarlo a hacer esto en tiempo de compilación con suficientes trucos (SFINAE y otras cosas). – Lalaland

+1

La única respuesta verdaderamente correcta que se puede dar a las preguntas de este formulario es "está permitido, pero no es obligatorio". En este caso, agregue una sopa de "el compilador generalmente no puede hacer mucha optimización algebraica en cálculos de coma flotante a menos que use el interruptor 'seguir adelante y optimizar la velocidad a expensas de * corrección *'". – zwol

Respuesta

1

EDIT: yo estaba equivocado, el compilador funciona como se esperaba cuando se utiliza un número de coma flotante.

Bueno gcc 4.6.3 en -03 ciertamente parece hacer esto, siempre y cuando la expresión esté relacionada con el entero.

código Ejemplo:

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

conjunto resultante

.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

Esto solo funciona para la primera expresión, la segunda expresión es más compleja y requiere plantillas –

Cuestiones relacionadas