我想看看编译器是否巧妙地通过函数指针内联调用。
如果我使用gcc 4.8和任何-Os或-O2进行编译,那么编译器会将apply1和apply2内联到main中,但另外对于apply2,它会通过函数指针移除间接调用,并将add1内联到代码中。在apply1中它没有。一般来说,似乎是声明我的函数static允许在其中进行此优化,但非静态不允许。
有没有解释这个问题的根本区别?
现在这主要是出于好奇心,但我需要编写一些高性能代码,因此想了解可能会引起这种差异的原因。
虽然这段代码是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);
}
答案 0 :(得分:1)
apply1,由于不是静态的,当前翻译单元外的文件可见,如果它与其他文件链接,可以想象从翻译单元外部调用。因此,可以使用func参数的add1以外的值调用它,因此优化将无效。