通过函数指针

时间:2016-03-29 16:52:41

标签: c++ c optimization

我想看看编译器是否巧妙地通过函数指针内联调用。

如果我使用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);
}

1 个答案:

答案 0 :(得分:1)

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