为啥 -O3 GCC Optimization 没有内联这个函数?

Posted

技术标签:

【中文标题】为啥 -O3 GCC Optimization 没有内联这个函数?【英文标题】:Why didn't -O3 GCC Optimization inline this function?为什么 -O3 GCC Optimization 没有内联这个函数? 【发布时间】:2010-09-26 23:58:55 【问题描述】:

在 GCC 编译器中,每当标记 -O3 时,编译器主要通过循环展开和函数内联进行优化。

但是,当我编译具有以下功能的应用程序时,它没有执行函数内联。从 gprofing 和 gconving 我可以注意到这个函数 (comp_t_delay) 不是从这个应用程序的主函数单元调用的。但是,它是从函数调用的,被函数调用的,被主函数调用的。

这里是 comp_t_delay(int in,int ip) 的代码,我想知道为什么 GCC 没有使用 -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);

【问题讨论】:

根据调用它的位置,它可能会认为代码膨胀超过了内联的好处。 如果你真的想要内联这个函数,这可能是个坏主意,你可以通过在函数定义中添加__attribute__((always_inline))来强制GCC内联它。 【参考方案1】:

它很可能没有内联它,因为它太长了。内联的长函数实际上会导致代码运行速度变慢 - 例如,CPU 寄存器会因更多变量而膨胀。在这种特殊情况下,gcc 决定不内联函数会更快。

【讨论】:

更不用说,当代码如此之长且涉及时,调用开销将只占所花费时间的一小部分,即内联不会带来任何可衡量的性能优势。只有当参数是常量并且知道该常量允许编译器消除大部分函数体时,内联才能使大型函数受益。

以上是关于为啥 -O3 GCC Optimization 没有内联这个函数?的主要内容,如果未能解决你的问题,请参考以下文章

24 GCC LTO - Link Time Optimization

24 GCC LTO - Link Time Optimization

为啥使用非标准 C(gcc 特定功能)对 linux 内核进行编码? [关闭]

为啥 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?

解决部分在Debug模式下程序没问题但是Release模式下出现问题的方法

GCC vs CLANG 指向 char* 优化的指针