为什么即使在最高优化级别下,gcc / clang也无法内联

时间:2019-07-05 07:37:39

标签: c++ optimization inline

我想知道为什么gcc / clang不内联函数foobar()。即使使用-O3也不会执行内联。我本以为gcc足够聪明。 如果将inline关键字添加到函数中,则会执行内联。但是,我认为手动指定inline关键字有点过时。

我还尝试使用gcc-8在本地计算机上编译此示例,但结果相同。

#include <cstdio>

int foobar()
{   
   return 0;
}

int main()
{
    printf("%d", foobar());
}

Compiler Explorer.

2 个答案:

答案 0 :(得分:2)

即使没有inline关键字,它们也可以内联。您的示例太琐碎了,不需要inling,因为在编译过程中知道了返回值

https://godbolt.org/z/tNcSrf

volatile int x;

int foobar(int x)
{   
   return x * x;
}

int main()
{
    printf("%d\n", foobar(x));
}

foobar:
        mul     r0, r0, r0
        bx      lr
main:
        push    {r3, lr}
        ldr     r3, .L5
        ldr     r0, .L5+4      //inlined here
        ldr     r1, [r3]
        mul     r1, r1, r1
        bl      printf
        movs    r0, #0
        pop     {r3, pc}
.L5:
        .word   x
        .word   .LC0
.LC0:
        .ascii  "%d\012\000"

它将保留该函数的副本,因为它可能是从另一个翻译单元调用的。如果在同一单元中多次调用该函数,则编译器可以随意完全不内联(取决于编译选项)。

为确保函数始终内联,您需要使用属性

inline __attribute__((always_inline)) int foobar(int x);

static inline __attribute__((always_inline)) int foobar(int x);

答案 1 :(得分:-2)

在上方引用@Mat的评论:

“该调用已内嵌在您提供的链接中,而main中没有对foobar的调用。”

很遗憾,我只能在两天后接受我的答案作为解决方案。 :-(