2012-05-02 30 views
5

如果我有一些依賴於可能爲零或非零(模板參數,在編譯時已知)的輸入的數學等式,優化程序會評估等式並優化它知道將評估爲0或1的表達式。優化器會根據編譯時常量推導出數學表達式嗎?

例如:

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

如果Eval<type>::value0x永遠是0

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

如果Eval<type>::value0x永遠是1

優化器是否可以計算出來並在代碼的其他地方用01替換x,或者這些計算是否會在運行時執行?

我用gcc 4.7 -O3

+3

如果你熟悉彙編,你可以看看,大會輸出。 – Mysticial

+0

我敢打賭,你甚至可以強制它在編譯時做足夠的詭計(SFINAE和whatnot)。 – Lalaland

+1

對於這種形式的問題,唯一真正正確的答案是「允許,但不是必須的」。在這種情況下,添加一個「編譯器通常不能在浮點計算上做很多代數優化,除非你使用'以*正確性*開關爲代價'優化速度」。 – zwol

回答

1

編輯:我錯了,編譯工程,並使用浮點數時預期。

那麼海灣合作委員會4.6.3在-03肯定似乎做到這一點,只要表達式是整數相關。

示例代碼:

#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 
+0

這隻適用於第一個表達,第二個表達更復雜,需要模板東西 –