2012-05-02 12 views
5

यदि मेरे पास कुछ गणितीय समीकरण हैं जो इनपुट पर भरोसा करते हैं जो शून्य या गैर-शून्य (टेम्पलेट तर्क, संकलन समय पर जाना जाता है) हो सकता है, तो ऑप्टिमाइज़र समीकरणों का मूल्यांकन करेगा और अभिव्यक्तियों को अनुकूलित करेगा, जो जानता है कि 0 या 1.एक अनुकूलक संकलन-समय स्थिरांक के आधार पर गणितीय अभिव्यक्तियों को कम करेगा?

का मूल्यांकन होगा

उदाहरण के लिए:

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

अगर Eval<type>::value0 है, x हमेशा 0 हो जाएगा।

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

अगर Eval<type>::value0 है, x हमेशा 1 हो जाएगा।

क्या ऑप्टिमाइज़र इसे समझ सकता है और को 0 या 1 कोड में कहीं और बदल सकता है, या ये गणना रनटाइम पर की जाएगी?

मैं जीसीसी 4.7 उपयोग कर रहा हूँ के साथ -O3

+3

यदि आप विधानसभा से परिचित हैं, तो आप उस के विधानसभा उत्पादन देख सकते हैं। – Mysticial

+0

मैं शर्त लगाता हूं कि आप इसे पर्याप्त चालबाजी (SFINAE और whatnot) के साथ संकलित समय पर भी ऐसा करने के लिए मजबूर कर सकते हैं। – Lalaland

+1

इस फ़ॉर्म के प्रश्नों को केवल एकमात्र सही उत्तर दिया जा सकता है "इसे अनुमति है, लेकिन इसकी आवश्यकता नहीं है।" इस मामले में, "कम्पाइलर" आमतौर पर फ्लोटिंग पॉइंट गणनाओं पर अधिक बीजगणितीय अनुकूलन नहीं कर सकता है जब तक कि आप 'आगे बढ़ें और * शुद्धता * स्विच की कीमत पर गति के लिए अनुकूलन न करें। " – zwol

उत्तर

1

संपादित करें: मैं गया था गलत, संकलक के रूप में जब एक चल बिन्दु संख्या का उपयोग कर की उम्मीद काम करता है।

अच्छी तरह से जीसी 4.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 
+0

यह केवल पहली अभिव्यक्ति के लिए काम करता है, दूसरी अभिव्यक्ति अधिक जटिल है और इसमें टेम्पलेटिंग सामग्री की आवश्यकता है –

संबंधित मुद्दे