我想知道为什么gcc / clang不内联函数foobar()
。即使使用-O3
也不会执行内联。我本以为gcc足够聪明。
如果将inline
关键字添加到函数中,则会执行内联。但是,我认为手动指定inline
关键字有点过时。
我还尝试使用gcc-8在本地计算机上编译此示例,但结果相同。
#include <cstdio>
int foobar()
{
return 0;
}
int main()
{
printf("%d", foobar());
}
答案 0 :(得分:2)
即使没有inline
关键字,它们也可以内联。您的示例太琐碎了,不需要inling,因为在编译过程中知道了返回值
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的调用。”
很遗憾,我只能在两天后接受我的答案作为解决方案。 :-(