C++ 通过函数指针优化和内联调用

C++ 通过函数指针优化和内联调用,c++,c,optimization,C++,C,Optimization,我想看看编译器是否足够聪明,能够通过函数指针内联调用 如果我在任何-Os或-O2中使用GCC4.8进行编译,那么编译器将把apply1和apply2内联到main中,但对于apply2,它将通过函数指针删除间接调用,并将内联add1也插入到代码中。在应用程序1中,它不是。通常情况下,将我的函数声明为静态可以在其中进行优化,而非静态则不行 有什么基本的差异可以解释这一点吗 这主要是出于好奇,但出于我需要编写的一些高性能代码的动机,因此我想了解是什么可能导致这种差异 虽然这个代码是C,但是如果C++

我想看看编译器是否足够聪明,能够通过函数指针内联调用

如果我在任何-Os或-O2中使用GCC4.8进行编译,那么编译器将把apply1和apply2内联到main中,但对于apply2,它将通过函数指针删除间接调用,并将内联add1也插入到代码中。在应用程序1中,它不是。通常情况下,将我的函数声明为静态可以在其中进行优化,而非静态则不行

有什么基本的差异可以解释这一点吗

这主要是出于好奇,但出于我需要编写的一些高性能代码的动机,因此我想了解是什么可能导致这种差异

虽然这个代码是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);
}
#包括
内部地址1(内部地址a)
{
返回a+1;
}
无效应用1(整数下限、整数上限、整数(*func)(整数))
{
for(int i=下限;i<上限;i++)
{
printf(“%d=%d\n”,i,func(i));
}
}
静态无效应用程序2(整数下限、整数上限、整数(*func)(整数))
{
for(int i=下限;i<上限;i++)
{
printf(“%d=%d\n”,i,func(i));
}
}
int main()
{
应用1(0,10,add1);
应用2(0,10,add1);
}

apply1由于不是静态的,所以对当前翻译单元之外的文件可见,如果它与其他文件链接,可以从翻译单元之外调用它。因此,可以使用func参数的add1以外的值调用它,因此优化将无效。

查看汇编代码。[在任何情况下,微优化都没有帮助,因为printf的成本会隐藏对func的间接调用的开销。]函数指针的内联是LTO涉及的主要功能之一。