-2
我想知道编译器是否足够聪明以通过函数指针内联调用。通过函数指针优化和内联调用
如果我用任何-Os或-O2编译使用gcc 4.8,那么编译器会将apply1和apply2内联到main中,但另外对于apply2它将通过函数指针移除间接调用,并将add1内联到代码中。在apply1中它没有。一般情况下,声明我的函数静态的情况似乎是允许这种优化的,但非静态不会。
是否有任何解释性的差异?
这现在主要是为了好奇,但是由于我需要写一些高性能的代码,所以想了解什么可能会引发这种差异。
虽然这段代码是C,但是如果我编译为C++,也会得到相同的结果。
#include <stdio.h>
int add1(int a)
{
return a + 1;
}
void apply1(int lower, int upper, int (* func)(int))
{
for (int i = lower; i < upper; i++)
{
printf("%d = %d\n", i, func(i));
}
}
static void apply2(int lower, int upper, int (* func)(int))
{
for (int i = lower; i < upper; i++)
{
printf("%d = %d\n", i, func(i));
}
}
int main()
{
apply1(0, 10, add1);
apply2(0, 10, add1);
}
看看汇编代码。 [在任何情况下,微优化都无济于事,因为间接调用func的开销将被printf的开销隐藏起来。] –
函数指针的内联是LTO中涉及的主要功能之一。 – o11c