2010-09-26 38 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