2010-09-26 64 views
2

在GCC編譯器中,無論何時-O3被標記,編譯器都主要通過循環展開和函數內聯來優化。爲什麼-O3 GCC Optimization沒有內聯這個功能?

但是,當我編譯具有以下功能的應用程序時,它沒有執行函數內聯。從gprofing和gconving我可以注意到這個函數(comp_t_delay)沒有從這個應用程序的主函數單元調用。但是,它是從函數調用的函數調用的,由main函數調用。

這裏是comp_t_delay(int類型,INT IP),我想知道爲什麼它使用-O3海合會沒有優化的代碼(任何幫助表示讚賞!):

static float 
comp_t_delay(int in,int ip) 
{ 

    int sb, sib,dx, dy; 
    t_type_ptr st, sit; 
    float d_ssi; 

    d_ssi = 0.; 

    sb = net[in].node_block[0]; 
    st = block[sb].type; 

    sib = net[in].node_block[ip]; 
    sit = block[sib].type; 

    assert(st != NULL); 
    assert(sit != NULL); 

    dx = abs(block[sib].x - block[sb].x); 
    dy = abs(block[sib].y - block[sb].y); 

    if(st == T_IO) 
    { 
     if(sit == T_IO) 
     d_ssi = de_io[dx][dy]; 
     else 
     d_ssi = de_iof[dx][dy]; 
    } 
    else 
    { 
     if(sit == T_IO) 
     d_ssi = de_fio[dx][dy]; 
     else 
     d_ssi = de_fb[dx][dy]; 
    } 
    if(d_ssi < 0) 
    { 
     printf 
     ("Error1\n"); 
     exit(1); 
    } 

    if(d_ssi < 0.) 
    { 
     printf 
     ("Error2\n"); 
     exit(1); 
    } 

    return (d_ssi); 
} 
+1

取決於調用了多少個地方,它可能已經決定代碼膨脹超過了內聯的好處。 – aaronasterling 2010-09-27 00:02:16

+0

如果你真的希望這個函數內聯,這可能是一個壞主意,你可以強制GCC通過在函數定義中加入__attribute __((always_inline))來內聯它。 – qdii 2012-09-29 16:46:39

回答

8

它最可能沒有內聯,因爲它太長了。內聯的長函數實際上可能會導致代碼運行速度變慢 - 例如,CPU寄存器會被更多變量臃腫。在這個特殊情況下,gcc認爲不要內聯函數會更快。

+3

更不用說,當代碼非常漫長並且涉及到代碼時,通話開銷將佔用時間的微不足道的百分比,即內聯不會帶來任何可衡量的性能優勢。唯一的時間內聯可以使大函數受益,即當參數是常量並且知道常量允許編譯器消除大部分函數體時。 – 2010-09-27 02:30:23